一. 測試目的
經常會有開發者提出基於 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