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