一. 测试目的
经常会有开发者提出基于 ESP32 的空闲堆内存问题,本文将测试在连接 Wi-Fi 和连接 BLE 的情况下 ESP32 的空闲堆内存大小。
二. 测试环境
为了保证测试结果的一致性,采用以下测试环境:
-
esp-idf
编写本文时,使用的 esp-idf release 版本对应的 commit 为 2befd5c。可通过以下命令确认:
结果为:git log --oneline -1
-
toolchain 版本
gcc version 5.2.0 (crosstool-NG crosstool-ng-1.22.0-80-g6c4433a),可通过以下命令确认:
结果为(log 过长,只需要关注最后的这部分。如下):xtensa-esp32-elf-gcc -v
Thread model: posix gcc version 5.2.0 (crosstool-NG crosstool-ng-1.22.0-80-g6c4433a)
-
测试主机
Linux 环境,Ubuntu 16.04 LTS,可选用其他平台。
-
开发板
ESP32-WROOM-32D 开发板,可选用其他基于 ESP32 的开发板。
- 测试示例
示例esp-idf/examples/get-started/hello_world
示例esp-idf/examples/wifi/getting_started/station
示例esp-idf/examples/bluetooth/ble_ibeacon
三. 测试过程
在正常编译烧录示例的基础上加入了以下代码来打印空闲堆内存:
你可以分别在刚进入 app_main() 函数时、完成 Wi-Fi 或 BLE 初始化时和 app_main() 函数结束时加上上述代码来打印查看空闲堆内存。
如何使用 esp-idf 创建与编译示例请查看 ESP-IDF 编程指南。
四. 测试结果
1. hello_world
示例
hello_world
在此示例的 app_main() 函数中的入口处和结尾处分别打印了空闲堆内存,如下:
打印空闲堆内存的位置 | 空闲堆内存大小 |
---|---|
app_main() 入口处 | 298724 B |
app_main() 结尾处 | 299600 B |
2. station
示例
station
在此示例的 app_main() 函数中的入口处和初始化 Wi-Fi 前后分别打印了空闲堆内存,如下:
打印空闲堆内存的位置 | 空闲堆内存大小 |
---|---|
app_main() 入口处 | 273996 B |
初始化 Wi-Fi 前 | 272372 B |
初始化 Wi-Fi 后 | 237364 B |
3. ble_ibeacon
示例
ble_ibeacon
在此示例的 app_main() 函数中的入口处、释放经典蓝牙协议栈前后和初始化 BLE 后分别打印了空闲堆内存,如下:
打印空闲堆内存的位置 | 空闲堆内存大小 |
---|---|
app_main() 入口处 | 226360 B |
释放经典蓝牙协议栈前 | 224440 B |
释放经典蓝牙协议栈后 | 239728 B |
初始化 BLE 后 | 201396 B |
五. 总结
经过上述测试后,我们可以总结得到:
- ESP32 的用户最大可支配的堆内存大概为:298 KB
- 初始化 Wi-Fi 需要使用 35 KB 左右的堆内存
- 初始化 BLE 需要使用 38 KB 左右的堆内存
- 如果在程序未来的运转中不需要某种服务,用户可以释放其对应的协议栈。比如上述过程中的经典蓝牙 BT,在释放经典蓝牙协议栈后的空闲堆内存增加了 15 KB