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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章