ESP32 优化笔记(一)内存优化

内存优化

ESP32 内部 SRAM 有 520KB,但是系统启动后可用内存约为 300KB(以 Hello World 工程为例),很多物联网应用都会使用 Wi-Fi 连接云端/ Bluetooth 和手机通信/ OTA 升级等功能,可能会面临内存不足问题。尽管 ESP32 可以外挂 PSRAM,为了节省成本,可以不使用 PSRAM 当然最佳。

优化措施

1 修改 SPI RAM config

2 修改 BLE 的配置

如果有打开蓝牙功能,可以关闭没有使用到的蓝牙部分功能。如图:

修改 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
...
  1. DRAM: 链接器将非常量静态数据和未初始化数据放入 0x3FFB0000 — 0x3FFF0000 这 256kB 的区域。注意,如果使用蓝牙堆栈,此区域会减少 64kB(通过将起始地址移至 0x3FFC0000 )。如果使用了内存跟踪的功能,该区域的长度还要减少 16kB 或者 32kB。放置静态数据后,留在此区域中的剩余空间都用作运行时堆。常量数据也可以放在 DRAM 中,需要使用 DRAM_ATTR 宏来声明。

    • bss: 未初始化的全局变量。
    • data: 已初始化的全局变量。
  2. IRAM: ESP-IDF 将内部 SRAM0 区域(在技术参考手册中有定义)的一部分分配为指令 RAM。除了开始的 64kB 用作 PRO CPU 和 APP CPU 的高速缓存外,剩余内存区域(从 0x40080000 至 0x400A0000 )被用来存储应用程序中部分需要在 RAM 中运行的代码。

4 动态申请的空间调试

未完

5 任务的栈的大小

未完

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