天天看點

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