天天看点

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

一. 测试目的

经常会有开发者提出基于 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),可通过以下命令确认:

    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

    示例

三. 测试过程

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

你可以分别在刚进入 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