內存優化
ESP32 內部 SRAM 有 520KB,但是系統啓動後可用內存約爲 300KB(以 Hello World
工程爲例),很多物聯網應用都會使用 Wi-Fi 連接雲端/ Bluetooth 和手機通信/ OTA 升級等功能,可能會面臨內存不足問題。儘管 ESP32 可以外掛 PSRAM,爲了節省成本,可以不使用 PSRAM 當然最佳。
優化措施
1 修改 SPI RAM config
2 修改 BLE 的配置
如果有打開藍牙功能,可以關閉沒有使用到的藍牙部分功能。如圖:
3 檢查是否有較大的全局變量
使用 make size-components
查看生成的固件內存使用情況, 查看你的模塊中是否存在較大的全局變量
total sizes:
DRAM .data size: 13272 bytes
DRAM .bss size: 34024 bytes
Used static DRAM: 47296 bytes ( 77284 available, 38.0% used)
Used static IRAM: 96352 bytes ( 34720 available, 73.5% used)
Flash code: 1101719 bytes
Flash rodata: 267772 bytes
Total image size:~1479115 bytes (.bin may be padded larger)
Per-archive contributions to ELF file:
Archive File DRAM .data & .bss IRAM Flash code & rodata Total
libbt.a 325 2338 460 155773 53596 212492
libmesh.a 186 3636 0 161096 38471 203389
libnet80211.a 924 8906 3782 111740 13750 139102
libmbedtls.a 100 268 30 108099 19263 127760
liblwip.a 19 4172 0 89540 16876 110607
libc.a 0 20 0 85809 6516 92345
...
-
DRAM: 鏈接器將非常量靜態數據和未初始化數據放入 0x3FFB0000 — 0x3FFF0000 這 256kB 的區域。注意,如果使用藍牙堆棧,此區域會減少 64kB(通過將起始地址移至 0x3FFC0000 )。如果使用了內存跟蹤的功能,該區域的長度還要減少 16kB 或者 32kB。放置靜態數據後,留在此區域中的剩餘空間都用作運行時堆。常量數據也可以放在 DRAM 中,需要使用 DRAM_ATTR 宏來聲明。
- bss: 未初始化的全局變量。
- data: 已初始化的全局變量。
-
IRAM: ESP-IDF 將內部 SRAM0 區域(在技術參考手冊中有定義)的一部分分配爲指令 RAM。除了開始的 64kB 用作 PRO CPU 和 APP CPU 的高速緩存外,剩餘內存區域(從 0x40080000 至 0x400A0000 )被用來存儲應用程序中部分需要在 RAM 中運行的代碼。
4 動態申請的空間調試
未完
5 任務的棧的大小
未完