此博客用来解决 ESP32 iram0_0_seg' overflowed 问题,如下:

/.espressif/tools/xtensa-esp32-elf/esp-2020r3-8.4.0/xtensa-esp32-elf/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld: region `iram0_0_seg' overflowed by 2280 bytes

此时有以下三种方便的方法来优化 IRAM 内存:

  • 启用 menuconfig -> Compiler option -> Optimization Level -> Optimize for size (-Os) 选项
  • 禁用 mencuofnig -> Component config -> LWIP -> Enable LWIP IRAM optimization 选项
  • 禁用 menuconfig -> Component config -> Wi-Fi -> WiFi IRAM speed optimizationmenuconfig -> Component config -> Wi-Fi -> WiFi RX IRAM speed optimization 选项

以下我们结合 ESP-IDF 里的 Wi-Fi station 示例 来查看 IRAM 优化的效果。

注: 详细信息请参考 Minimizing RAM Usage

1 IRAM 内存优化方法的具体描述

首先直接使用默认的 menuconfig 配置来查看 IRAM 使用,在 Wi-Fi station 示例 终端下输入 idf.py size-components,可以看到以下结果:

Total sizes:
 DRAM .data size:   13012 bytes
 DRAM .bss  size:   17872 bytes
Used static DRAM:   30884 bytes ( 149852 available, 17.1% used)
Used static IRAM:   87397 bytes (  43675 available, 66.7% used)
      Flash code:  459267 bytes
    Flash rodata:   93000 bytes
Total image size:~ 652676 bytes (.bin may be padded larger)

此时使用的 IRAM 空间为 87397 bytes。现在我们一步步使用 IRAM 优化方法进行优化。

1.1 启用 menuconfig -> Compiler option -> Optimization Level -> Optimize for size (-Os) 选项

menuconfig 里启用 Optimize for size 选项,如下:
在这里插入图片描述
配置 menuconfig 后在终端下输入 idf.py size-components,可以发现:

Total sizes:
 DRAM .data size:   12848 bytes
 DRAM .bss  size:   17856 bytes
Used static DRAM:   30704 bytes ( 150032 available, 17.0% used)
Used static IRAM:   82571 bytes (  48501 available, 63.0% used)
      Flash code:  425987 bytes
    Flash rodata:   87952 bytes
Total image size:~ 609358 bytes (.bin may be padded larger)

此时使用的 IRAM 空间由 87397 bytes 降低到了 82571 bytes

1.2 禁用 mencuofnig -> Component config -> LWIP -> Enable LWIP IRAM optimization 选项

menuconfig 里禁用 Enable LWIP IRAM optimization 选项,如下:
在这里插入图片描述
此时可以发现 Wi-Fi station 示例默认禁用了此选项。为了测试此选项对 IRAM 的影响,我们现在将此选项启用,如下:
在这里插入图片描述

配置 menuconfig 后在终端下输入 idf.py size-components,可以发现:

Total sizes:
 DRAM .data size:   12848 bytes
 DRAM .bss  size:   17856 bytes
Used static DRAM:   30704 bytes ( 150032 available, 17.0% used)
Used static IRAM:   93115 bytes (  37957 available, 71.0% used)
      Flash code:  416311 bytes
    Flash rodata:   87992 bytes
Total image size:~ 610266 bytes (.bin may be padded larger)

此时使用的 IRAM 空间由 87397 bytes 增加到了 93115 bytes。由于这次尝试是启用了 Enable LWIP IRAM optimization 选项。这说明禁用此选项确实可以节约 6 KB 左右的 IRAM。

1.3 禁用 menuconfig -> Component config -> Wi-Fi -> WiFi IRAM speed optimizationmenuconfig -> Component config -> Wi-Fi -> WiFi RX IRAM speed optimization 选项

menuconfig 里禁用 WiFi IRAM speed optimizationWiFi RX IRAM speed optimization 选项,如下:
在这里插入图片描述

配置 menuconfig 后在终端下输入 idf.py size-components,可以发现:

Total sizes:
 DRAM .data size:   12848 bytes
 DRAM .bss  size:   17856 bytes
Used static DRAM:   30704 bytes ( 150032 available, 17.0% used)
Used static IRAM:   51463 bytes (  79609 available, 39.3% used)
      Flash code:  455419 bytes
    Flash rodata:   87856 bytes
Total image size:~ 607586 bytes (.bin may be padded larger)

此时使用的 IRAM 空间由 87397 bytes 降低到了 51463 bytes。此方法足足节约了 30 KB 的 IRAM。

注:以上配置会牺牲 Wi-Fi 的部分性能,但绝大部分情况下 Wi-Fi 仍可以正常使用。

2 IRAM 进一步优化的方法

如果在进行上述 IRAM 优化后仍然出现 IRAM 不足的情况,此时就需要手动将一些放在 IRAM 里的函数取出。已牺牲部分性能的方式换取程序运行,首先我们依然可以在终端下输入 idf.py size-components,如下:

Total sizes:
 DRAM .data size:   12848 bytes
 DRAM .bss  size:   17856 bytes
Used static DRAM:   30704 bytes ( 150032 available, 17.0% used)
Used static IRAM:   51463 bytes (  79609 available, 39.3% used)
      Flash code:  455419 bytes
    Flash rodata:   87856 bytes
Total image size:~ 607586 bytes (.bin may be padded larger)
Per-archive contributions to ELF file:
            Archive File DRAM .data & .bss & other   IRAM   D/IRAM Flash code & rodata   Total
           libnet80211.a       1062   6184       0     47        0     110032    21649  138974
               liblwip.a         21   3832       0      0        0      66991    15228   86072
                 libpp.a       1262   3785       0   1399        0      53749     4485   64680
                  libc.a          4      0       0      0        0      55319     4187   59510
         libmbedcrypto.a         64     29       0     30        0      40929     4256   45308
                libphy.a       1423    702       0   7786        0      32114        0   42025
     libwpa_supplicant.a         12    844       0      0        0      36696     3464   41016
           libfreertos.a       4140    792       0  13192        0          0     1898   20022
          libnvs_flash.a          0     24       0      0        0      11405     3275   14704
           libesp_wifi.a        584     80       0    421        0       5978     4662   11725
                libsoc.a        263      4       0   6691        0       1691     1790   10439
          libspi_flash.a        908    294       0   5908        0       1336     1516    9962
         libesp_common.a        153    155       0    267        0       2000     6309    8884
              libesp32.a         24     75       0   3104        0       2683     2623    8509
                libgcc.a          8     12       0    193        0       5555      872    6640
          libesp_netif.a         12     25       0      0        0       4350     2242    6629
                libvfs.a        308     48       0      0        0       4637      727    5720
         libesp_system.a       1706     29       0   2528        0        261      222    4746
               libheap.a        316      8       0   2775        0        881      759    4739
             libdriver.a         80     63       0    160        0       3010     1246    4559
          libesp_event.a          0      4       0      0        0       3019     1139    4162
             libstdc++.a          8     20       0      0        0       2529     1044    3601
          libesp_timer.a         16     20       0   1131        0        892      857    2916
             libnewlib.a        190    272       0    957        0        769      106    2294
               libmain.a          0      8       0      0        0       1026     1125    2159
              libefuse.a         36      4       0      0        0        834      701    1575
 libbootloader_support.a          0      0       0    882        0        536       36    1454
            libpthread.a         16     12       0    223        0        653      540    1444
                liblog.a          8    272       0    258        0        657      183    1378
        libesp_ringbuf.a          0      0       0    701        0          0      170     871
               libcore.a          0     29       0      0        0        609      228     866
         libapp_update.a          1     12       0    154        0        158      493     818
            libesp_ipc.a          0     56       0    171        0        357      130     714
             libxtensa.a          0      0       0    421        0          0       58     479
                libhal.a          0      0       0    443        0          0       32     475
                librtc.a          0      0       0    460        0          0        0     460
      libtcpip_adapter.a          0     17       0      0        0        211        0     228
            libcoexist.a        144      0       0      0        0          0        0     144
                   (exe)          0      0       0      3        0          3       12      18
                libcxx.a          0      0       0      0        0         11        0      11
            libesp_eth.a          0      0       0      0        0          0        0       0
            libmbedtls.a          0      0       0      0        0          0        0       0
           libmbedx509.a          0      0       0      0        0          0        0       0
               libmesh.a          0      0       0      0        0          0        0       0
          libsoc_esp32.a          0      0       0      0        0          0        0       0

上述可以看到每个库的 IRAM 占用。将部分库里对性能要求相对不太高的 API 注释掉 IRAM_ATTR 标记来将这些 API 从 IRAM 中取出。这部分需要耐心,一步步进行测试 Debug 直到能顺利编译的同时也不会影响程序的正常工作。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐