ESP32 测试(六):ESP32 空闲堆内存测试

一. 测试目的

经常会有开发者提出基于 ESP32 的空闲堆内存问题,本文将测试在连接 Wi-Fi 和连接 BLE 的情况下 ESP32 的空闲堆内存大小。


二. 测试环境

为了保证测试结果的一致性,采用以下测试环境:

  • esp-idf
    编写本文时,使用的 esp-idf release 版本对应的 commit 为 2befd5c。可通过以下命令确认:

    git log --oneline -1
    

    结果为:

    2befd5c Merge branch 'feature/wifi_prov_ext_httpd_v3.3' into 'release/v3.3'
    
  • toolchain 版本
    gcc version 5.2.0 (crosstool-NG crosstool-ng-1.22.0-80-g6c4433a),可通过以下命令确认:

    xtensa-esp32-elf-gcc -v
    

    结果为(log 过长,只需要关注最后的这部分。如下):

    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 示例


三. 测试过程

在正常编译烧录示例的基础上加入了以下代码来打印空闲堆内存:

printf("free_heap_size = %d\n", esp_get_free_heap_size());

你可以分别在刚进入 app_main() 函数时、完成 Wi-Fi 或 BLE 初始化时和 app_main() 函数结束时加上上述代码来打印查看空闲堆内存。

如何使用 esp-idf 创建与编译示例请查看 ESP-IDF 编程指南


四. 测试结果

1. hello_world 示例

在此示例的 app_main() 函数中的入口处和结尾处分别打印了空闲堆内存,如下:

打印空闲堆内存的位置 空闲堆内存大小
app_main() 入口处 298724 B
app_main() 结尾处 299600 B

2. station 示例

在此示例的 app_main() 函数中的入口处和初始化 Wi-Fi 前后分别打印了空闲堆内存,如下:

打印空闲堆内存的位置 空闲堆内存大小
app_main() 入口处 273996 B
初始化 Wi-Fi 前 272372 B
初始化 Wi-Fi 后 237364 B

3. 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
发布了53 篇原创文章 · 获赞 21 · 访问量 8368

猜你喜欢

转载自blog.csdn.net/zztiger123/article/details/103910151