一. 测试目的
经常会有开发者提出基于 ESP32 Wi-Fi、BLE 等示例的固件大小及优化 & 相关组件大小对比,本文将测试针对相关示例进行修改测试。
二. 测试环境
为了保证测试结果的一致性,采用以下测试环境:
-
esp-idf
编写本文时,使用的 esp-idf release 版本对应的 commit 为 7d0f1536e。可通过以下命令确认:git log --oneline -1
结果为:
7d0f1536e (HEAD -> release/v4.2, origin/release/v4.2) Merge branch 'bugfix/fix_adc_init_code_setting_for_esp32s2' into 'master'
-
toolchain 版本
gcc version 8.2.0 (crosstool-NG esp-2020r1) ,可通过以下命令确认:xtensa-esp32-elf-gcc -v
结果为(log 过长,只需要关注最后的这部分。如下):
Thread model: posix gcc version 8.2.0 (crosstool-NG esp-2020r1)
-
测试主机
Linux 环境,Ubuntu 18.04 LTS,可选用其他平台。 -
开发板
ESP32-WROOM-32D 开发板,可选用其他基于 ESP32 的开发板。 -
测试示例
esp-idf/examples/get-started/hello_world
示例
esp-idf/examples/wifi/getting_started/station
示例
esp-idf/examples/protocols/https_mbedtls
示例
esp-idf/examples/bluetooth/bluedroid/ble/blufi
示例
esp-idf/examples/bluetooth/nimble/bleprph
示例
三. 测试过程
在正常编译烧录示例的基础上可使用 idf.py menuconfig
来配置优化固件大小,具体如下:
-
开启尺寸优化
在
idf.py menuconfig
中选择Compiler option
->Optimize level
->Optimize for size
(默认为Debug
) -
降低 log 打印等级
在
idf.py menuconfig
中选择Component config
->Log output
->Default log verbosity
->Error
(默认为Info
)
如何使用 esp-idf 创建与编译示例请查看 ESP-IDF 编程指南。
注:在工程下的终端输入
idf.py size-components
查看component size
四. 测试结果
4.1. hello_world
示例
此部分为编译烧录 hello_world
示例后的 component size
以及 APP Bin
的大小。以下分为优化固件大小前后两部分。
-
优化固件大小前
APP Bin
大小为:144K hello-world.bin
component size
大小为:Total sizes: DRAM .data size: 8552 bytes DRAM .bss size: 2048 bytes Used static DRAM: 10600 bytes ( 170136 available, 5.9% used) Used static IRAM: 39747 bytes ( 91325 available, 30.3% used) Flash code: 76803 bytes Flash rodata: 22056 bytes Total image size:~ 147158 bytes (.bin may be padded larger) Per-archive contributions to ELF file: Archive File DRAM .data & .bss IRAM Flash code & rodata Total libc.a 364 0 0 54820 3833 59017 libfreertos.a 4140 776 12787 0 1762 19465 libesp32.a 2126 106 6543 5118 3385 17278 libsoc.a 184 4 6732 1501 1940 10361 libspi_flash.a 783 294 4878 1143 1380 8478 libesp_common.a 16 204 559 1077 5345 7201 libvfs.a 308 48 0 5579 923 6858 libheap.a 305 4 3135 877 729 5050 libdriver.a 80 20 0 3053 768 3921 libnewlib.a 152 272 820 868 88 2200 libefuse.a 16 4 0 1162 720 1902 libbootloader_support.a 0 0 1020 503 0 1523 liblog.a 8 272 580 94 151 1105 libesp_ringbuf.a 0 0 858 0 154 1012 libapp_update.a 0 4 109 159 474 746 libhal.a 0 0 447 0 32 479 libmain.a 0 0 0 214 248 462 libpthread.a 8 12 0 264 0 284 libxtensa.a 0 0 213 0 0 213 libgcc.a 0 0 0 0 160 160 (exe) 0 0 3 3 12 18 libcxx.a 0 0 0 11 0 11 libjson.a 0 0 0 0 0 0 libmbedcrypto.a 0 0 0 0 0 0 libwpa_supplicant.a 0 0 0 0 0 0
-
优化固件大小后
APP Bin
大小为:136K hello-world.bin
component size
大小为:Total sizes: DRAM .data size: 8264 bytes DRAM .bss size: 2040 bytes Used static DRAM: 10304 bytes ( 170432 available, 5.7% used) Used static IRAM: 35035 bytes ( 96037 available, 26.7% used) Flash code: 73287 bytes Flash rodata: 19436 bytes Total image size:~ 136022 bytes (.bin may be padded larger) Per-archive contributions to ELF file: Archive File DRAM .data & .bss IRAM Flash code & rodata Total libc.a 364 0 0 54820 3823 59007 libfreertos.a 4140 776 11631 0 1618 18165 libesp32.a 1945 106 5570 4540 2687 14848 libsoc.a 132 4 5881 1329 1677 9023 libspi_flash.a 777 294 4539 964 1083 7657 libesp_common.a 16 204 404 980 5081 6685 libvfs.a 308 48 0 4368 558 5282 libheap.a 298 4 2483 640 568 3993 libdriver.a 80 20 0 2479 677 3256 libnewlib.a 152 272 800 778 88 2090 libefuse.a 16 4 0 917 670 1607 libbootloader_support.a 0 0 854 470 16 1340 liblog.a 8 272 493 84 147 1004 libesp_ringbuf.a 0 0 671 0 152 823 libapp_update.a 0 4 88 131 471 694 libhal.a 0 0 447 0 32 479 libmain.a 0 0 0 202 223 425 libpthread.a 8 12 0 246 0 266 libxtensa.a 0 0 173 0 0 173 libgcc.a 0 0 0 0 160 160 (exe) 0 0 3 3 12 18 libcxx.a 0 0 0 11 0 11 libjson.a 0 0 0 0 0 0 libmbedcrypto.a 0 0 0 0 0 0 libwpa_supplicant.a 0 0 0 0 0 0
4.2. station
示例
此部分为编译烧录 station
示例后的 component size
以及 APP Bin
的大小。以下分为优化固件大小前后两部分。
-
优化固件大小前
APP Bin
大小为:663K wifi_station.bin