ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ESP-IDF 固件静态内存与体积分析:IDF Size 工具完整实战指南

ESP-IDF 固件静态内存与体积分析:IDF Size 工具完整实战指南 ESP-IDF 固件静态内存与体积分析IDF Size 工具完整实战指南【免费下载链接】esp-idfEspressif IoT Development Framework. Official development framework for Espressif SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf导读在 ESP-IDF 嵌入式开发中静态分配的代码段.text、数据段.data/.bss占用多少 IRAM、DRAM 与 Flash直接决定了固件能否通过链接、运行时堆还能剩多少。IDF Size 是 ESP-IDF 自带的静态内存分析工具它通过解析链接生成的 map 文件把晦涩的 ELF 段信息整理成内存类型用量汇总组件归档库贡献源文件贡献三级粒度视图还支持两个固件之间的精确体积对比甚至能在链接失败内存溢出时仍然输出部分用量数据。读完本文你将掌握idf.py size、idf.py size-components、idf.py size-files、idf.py size --diff以及idf_size.py的完整用法并能结合本仓库源码理解其底层工作原理从而在开发中快速定位体积大户、优化内存布局。IDF Size 工具体系概览IDF Size 的核心能力由独立的 Python 包esp-idf-size提供ESP-IDF 在此基础上提供了三层使用入口入口定位说明idf.py size高层封装先构建工程再输出内存类型用量汇总Memory Type Usage Summaryidf.py size-components高层封装输出各静态库归档per-archive对固件体积的贡献idf.py size-files高层封装输出各对象文件per-file对应单个源文件的体积贡献idf_size.py底层便捷包装直接调用esp-idf-size模块可脱离完整构建流程、在链接失败时分析 map 文件其中idf.py的三个子命令支持通过--help查看完整选项如报告输出格式idf_size.py同样可用idf_size.py --help查看用法。从源码看idf_size.py本质是一个极薄的包装脚本它尝试导入esp_idf_size模块若未安装会提示 WARNING: esp-idf-size not installed, please run the install script to install it 并以状态码 1 退出安装成功后则以python -m esp_idf_size的方式把剩余参数透传给真正的工具见 tools/idf_size.py。内存类型用量汇总idf.py sizeidf.py size输出固件二进制中各内存类型的静态分配情况汇总一个典型输出如下以文档中的 hello_world 工程为例$ idf.py size Memory Type Usage Summary ┏━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓ ┃ Memory Type/Section ┃ Used [bytes] ┃ Used [%] ┃ Remain [bytes] ┃ Total [bytes] ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩ │ Flash Code │ 64442 │ │ │ │ │ .text │ 64442 │ │ │ │ │ IRAM │ 51711 │ 39.45 │ 79361 │ 131072 │ │ .text │ 50683 │ 38.67 │ │ │ │ .vectors │ 1028 │ 0.78 │ │ │ │ Flash Data │ 30208 │ │ │ │ │ .rodata │ 29952 │ │ │ │ │ .appdesc │ 256 │ │ │ │ │ DRAM │ 10716 │ 5.93 │ 170020 │ 180736 │ │ .data │ 8564 │ 4.74 │ │ │ │ .bss │ 2152 │ 1.19 │ │ │ │ RTC FAST │ 32 │ 0.39 │ 8160 │ 8192 │ │ .force_fast │ 32 │ 0.39 │ │ │ │ RTC SLOW │ 24 │ 0.29 │ 8168 │ 8192 │ │ .rtc_slow_reserved │ 24 │ 0.29 │ │ │ └───────────────────────┴──────────────┴──────────┴────────────────┴───────────────┘ Total image size: 154957 bytes (.bin may be padded larger)表中每个字段的含义如下Memory Type/SectionEspressif 芯片包含多种内存类型详见 docs/zh_CN/api-guides/memory-types.rst 与对应芯片的《技术参考手册》。Memory Type 列列出内存类型其下缩进的子行列出加载到该类型中的 ELFSectionsUsed每种内存类型或 section 的已用字节数Used [%]为占用比例仅对具有明确总容量的内存类型显示Remain该内存类型剩余的可用字节数Total该内存类型的总可用容量它由链接脚本中MEMORY命令定义的、映射到该内存类型的存储区大小决定。Total 容量是如何计算的文档明确说明每种内存类型如 IRAM的Total由链接脚本用MEMORY命令生成、并在构建过程中写入链接 map 文件的存储区大小决定。esp-idf-size工具为每个目标芯片内置了 YAML 文件其中基于技术参考手册TRM描述了各内存类型的地址范围工具把 map 文件中的存储区范围映射到这些内存类型范围从而计算每种内存类型的总可用内存。需要特别注意Total可能小于 TRM 标称值部分内存可能被 bootloader、cache 等按配置保留实际可用容量与手册数值存在差异RemainTotal− 加载到该内存类型的各输出Sections大小之和不同内存类型可能映射到同一块物理内存在某些目标芯片上IRAM 与 DRAM 可能映射到同一物理内存的不同虚拟地址分别通过指令总线与数据总线访问此时汇总表中统一以DIRAM表示输出中的Total image size是二进制文件的估计总大小.bin实际可能因填充而更大。关键内存类型与输出段解读所有非零大小的输出 section 都会出现在汇总中其名称由链接脚本中的输出段名决定。下面是最值得关注的内存类型DRAM编译期静态分配的 DRAM 总量。Remain表示运行时可供堆heap使用的 DRAM 余量——但由于元数据开销、实现约束和启动期堆分配实际 DRAM 堆会小于该值。.data编译期分配的、初始值非零的静态变量staticky allocated variables initialized to non-zero values。.data还会在固件镜像中占用空间以保存非零初始值.bss编译期分配的、初始化为零的静态变量。.bss不会额外占用 Flash 空间IRAM编译期静态分配的 IRAM 总量。Remain表示运行时可供堆使用的 IRAM 余量同样会因元数据与启动分配而偏小。.text从 IRAM 执行的代码量。由于代码初始存放在 Flash、启动时拷贝到 IRAM.text也会占用固件镜像空间Flash Code从 Flash 执行的代码。.text经 Flash cache 执行的代码量对应 IROMFlash Data存放在 Flash 中的数据。.rodata经 Flash cache 加载的只读数据量对应 DROMRTC FAST/RTC SLOW分别对应 RTC 快速/慢速内存中的静态分配如.force_fast、.rtc_slow_reserved常用于深度睡眠唤醒后仍需保持的变量。关于 Total image size 的说明汇总表底部的Total image size是估算出的二进制总大小。文档特别提醒报告中的总大小可能小于《技术参考手册》中的数值因为存在保留内存与应用配置的影响且默认不包含应用可用的总 Flash 大小——由于 bootloader、分区表和应用分区大小等其他数据的存在应用可用 Flash 总量无法可靠确定。组件级分析idf.py size-componentsidf.py size的汇总输出不足以定位体积过大的根因。idf.py size-components给出了每个静态库归档static library archive对最终二进制大小的贡献$ idf.py size-components Per-archive contributions to ELF file ┏━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┓ ┃ Archive File ┃ Total Size ┃ DRAM ┃ .bss ┃ .data ┃ IRAM ┃ .text ┃ .vectors ┃ Flash Code ┃ .text ┃ Flash Data ┃ .rodata ┃ .appdesc ┃ RTC SLOW ┃ .rtc_slow_reserved ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━╇━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━┩ │ libnet80211.a │ 116712 │ 9454 │ 8393 │ 1061 │ 5310 │ 5310 │ 0 │ 89698 │ 89698 │ 12250 │ 12250 │ 0 │ 0 │ 0 │ │ libmbedcrypto.a │ 105863 │ 141 │ 81 │ 60 │ 0 │ 0 │ 0 │ 71251 │ 71251 │ 34471 │ 34471 │ 0 │ 0 │ 0 │ │ liblwip.a │ 85394 │ 2470 │ 2458 │ 12 │ 0 │ 0 │ 0 │ 79486 │ 79486 │ 3438 │ 3438 │ 0 │ 0 │ 0 │ │ libpp.a │ 66484 │ 3915 │ 1444 │ 2471 │ 20004 │ 20004 │ 0 │ 37714 │ 37714 │ 4851 │ 4851 │ 0 │ 0 │ 0 │ │ libc.a │ 59525 │ 576 │ 316 │ 260 │ 0 │ 0 │ 0 │ 55513 │ 55513 │ 3436 │ 3436 │ 0 │ 0 │ 0 │ │ libesp_app_format.a │ 53209 │ 10 │ 10 │ 0 │ 0 │ 0 │ 0 │ 417 │ 417 │ 52782 │ 52526 │ 256 │ 0 │ 0 │ │ ...其余归档行略 │ … │ … │ … │ … │ … │ … │ … │ … │ … │ … │ … │ … │ … │ └─────────────────────────┴────────────┴──────┴──────┴───────┴───────┴───────┴──────────┴────────────┴───────┴────────────┴─────────┴──────────┴──────────┴────────────────────┘阅读该表的要点一个组件通常对应一个静态库归档但也有例外某些归档是组件引入的二进制库例如libnet80211.a由esp_wifi组件引入表中还会出现libc.a、libgcc.a这类工具链库提供标准 C/C 库与工具链内建功能如果工程很简单、只有一个main组件那么工程的全部代码都会归到libmain.a名下如果工程包含自定义组件见 docs/zh_CN/api-guides/build-system.rst每个组件会单独占一行表按归档对二进制大小的总贡献降序排列各列含义与 Size Summary 中的内存类型/输出段一致(exe)归档是特殊条目它包含直接链接进最终二进制的目标文件即不属于任何归档文件的那些对象。链接器合并导致的 .rodata 异常偏大文档特别提醒一个易误读的现象单个归档的Flash Data中的.rodata可能显得非常大。原因是链接器松弛linker relaxations链接器会尝试把来自所有归档、带有MERGE与STRINGS标志的节合并到一起以进行尾字符串优化tail string optimization。结果某个归档示例中体现为libesp_app_format.a的.rodata可能吞并了其他归档的字符串字面量导致其.rodata异常庞大。此行为可通过启用CONFIG_COMPILER_NO_MERGE_CONSTANTS选项关闭仅对 GCC 工具链有效具体请查看该选项的帮助说明。源文件级分析idf.py size-files若需要更细的粒度idf.py size-files会给出每个对象文件对最终二进制大小的贡献每个对象文件对应一个源文件$ idf.py size-files Per-file contributions to ELF file ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━━┳━━━━━━┳━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┓ ┃ Object File ┃ Total Size ┃ DRAM ┃ .bss ┃ .data ┃ IRAM ┃ .text ┃ .vectors ┃ Flash Code ┃ .text ┃ Flash Data ┃ .rodata ┃ .appdesc ┃ RTC SLOW ┃ .rtc_slow_reserved ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━╇━━━━━━┇━━━━━━━╇━━━━━━╇━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━┩ │ esp_app_desc.c.obj │ 72313 │ 10 │ 10 │ 0 │ 0 │ 0 │ 0 │ 417 │ 417 │ 71886 │ 71630 │ 256 │ 0 │ 0 │ │ x509_crt_bundle.S.obj │ 67810 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 67810 │ 67810 │ 0 │ 0 │ 0 │ │ ecp_curves.c.obj │ 36415 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 6875 │ 6875 │ 29540 │ 29540 │ 0 │ 0 │ 0 │ │ phy_chip_v7.o │ 19384 │ 783 │ 533 │ 250 │ 2186 │ 2186 │ 0 │ 16415 │ 16415 │ 0 │ 0 │ 0 │ 0 │ 0 │ │ wl_cnx.o │ 18567 │ 3891 │ 3889 │ 2 │ 277 │ 277 │ 0 │ 13343 │ 13343 │ 1056 │ 1056 │ 0 │ 0 │ 0 │ │ ...其余对象行略 │ … │ … │ … │ … │ … │ … │ … │ … │ … │ … │ … │ … │ … │ └─────────────────────────────────────┴────────────┴──────┴──────┴───────┴──────┴───────┴──────────┴────────────┴───────┴────────────┴─────────┴──────────┴──────────┴────────────────────┘表格同样按对象文件对体积的总贡献降序排列各列含义与 Size Summary 一致。这个视角非常适合做体积归因示例输出中x509_crt_bundle.S.obj为固件贡献了 67,810 字节且全部是 Flash 中的.rodata。据此可以推断该应用启用了证书捆绑Certificate Bundle功能见 docs/zh_CN/api-reference/protocols/esp_crt_bundle.rst如果不需要该功能至少可节省这么多字节的固件空间部分对象文件来自二进制库如phy_chip_v7.o、wl_cnx.o等在源码树中找不到对应源文件。要定位某个源文件属于哪个组件一般可以在 ESP-IDF 源码树中搜索或者查看链接 map 文件中的完整路径参见 docs/zh_CN/api-guides/build-system.rst 中关于 linker map file 的说明。对比两个固件--diff选项当修改影响固件体积的代码时可以用--diff精确分析体积差异。该选项可搭配前面提到的所有子命令使用参数可以是一个对比工程的构建目录或工程目录也可以直接是 map 文件路径。以对比两个hello_world构建为例官方文档给出的标准流程是复制两份hello_world工程目录第一份命名为hello_world_Og使用默认的CONFIG_COMPILER_OPTIMIZATION优化级别Debug (-Og)作为REFERENCE参考工程第二份命名为hello_world_Os通过idf.py menuconfig将优化级别改为Optimize for size (-Os)作为CURRENT当前工程分别构建两个工程后在hello_world_Os工程目录下执行$ idf.py size --diff ../hello_world_Og CURRENT project file: hello_world_Os/build/hello_world.map REFERENCE project file: hello_world_Og/build/hello_world.map Difference is counted as CURRENT - REFERENCE, i.e. a positive number means that CURRENT is larger. Memory Type Usage Summary ┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓ ┃ Memory Type/Section ┃ Used [bytes] ┃ Used [%] ┃ Remain [bytes] ┃ Total [bytes] ┃ ┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩ │ Flash Code │ 74498 -6168 │ 2.23 -0.18 │ 3267806 6168 │ 3342304 0 │ │ .text │ 74498 -6168 │ 2.23 -0.18 │ │ │ │ IRAM │ 45539 -6296 │ 34.74 -4.8 │ 85533 6296 │ 131072 0 │ │ .text │ 44511 -6296 │ 33.96 -4.8 │ │ │ │ Flash Data │ 35784 -2440 │ 0.85 -0.06 │ 4158488 2440 │ 4194272 0 │ │ .rodata │ 35528 -2440 │ 0.85 -0.06 │ │ │ │ DRAM │ 10844 -392 │ 6.0 -0.22 │ 169892 392 │ 180736 0 │ │ .data │ 8612 -376 │ 4.76 -0.21 │ │ │ │ .bss │ 2232 -16 │ 1.23 -0.01 │ │ │ └─────────────────────┴──────────────┴──────────────┴────────────────┴────────────────┘ Total image size: 164432 -15280 bytes (.bin may be padded larger)diff 模式解读要点每个数值列现在同时显示差值差值的含义是CURRENT - REFERENCE正数表示当前工程更大示例中hello_world_Os最终镜像比hello_world_Og小 15,280 字节Flash Code少用 6,168 字节因而Remain多出 6,168 字节而Total无差异尾部0同样的 diff 也可以用于组件级静态库归档对比$ idf.py size-components --diff ../hello_world_Og以及每个源文件级别的对比$ idf.py size-files --diff ../hello_world_Og链接失败时查看部分用量idf_size.py当静态内存分配过多时链接器会报错典型错误形如DRAM segment data does not fit region iram0_0_seg overflowed by 44 bytes此时idf.py size也会失败因为它依赖完整构建。但可以改用idf_size.py它允许在 ESP-IDF 环境中直接调用esp-idf-size读取链接器已生成的部分 map 文件从而看到部分静态内存用量。该脚本需要一个链接 map 文件作为参数位于工程的构建目录下命名为projectname.map$ idf_size.py projectname.map warning: DRAM overflow detected!: output section or its part .dram0.bss(addr: 1073422848, size: 2240) does not fit into any memory region and will be assigned to the preceding dram0_0_seg memory region warning: DRAM overflow detected!: output section or its part .dram0.data(addr: 1073414144, size: 8704) does not fit into any memory region and will be assigned to the preceding dram0_0_seg memory region Memory Type Usage Summary ┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓ ┃ Memory Type/Section ┃ Used [bytes] ┃ Used [%] ┃ Remain [bytes] ┃ Total [bytes] ┃ ┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩ │ Flash Code │ 79759 │ 2.39 │ 3262545 │ 3342304 │ │ .text │ 79759 │ 2.39 │ │ │ │ IRAM │ 51106 │ 38.99 │ 79966 │ 131072 │ │ .text │ 50079 │ 38.21 │ │ │ │ .vectors │ 1027 │ 0.78 │ │ │ │ Flash Data │ 38576 │ 0.92 │ 4155696 │ 4194272 │ │ .rodata │ 38320 │ 0.91 │ │ │ │ .appdesc │ 256 │ 0.01 │ │ │ │ DRAM │ 10944 │ 0 │ -10944 │ 0 │ │ .data_overflow │ 8704 │ │ │ │ │ .bss_overflow │ 2240 │ │ │ │ └─────────────────────┴──────────────┴──────────┴────────────────┴───────────────┘ Total image size: 178145 bytes (.bin may be padded larger)要点没有装入内存区域的 section 会带上_overflow后缀如上例的.data_overflow、.bss_overflow同时工具会输出 DRAM overflow detected! 警告Remain变为负数。这是链接失败场景下定位超限来源的关键信息。输出格式与高级选项idf.py的 size 相关子命令共用一组选项。从 tools/idf_py_actions/core_ext.py 的size_options定义可以看到三个可用选项选项说明--format指定输出格式可选default等价于text、csv、json2、tree、raw默认default。json2适合脚本解析与 CI 集成--diff指定对比工程的 map 文件或工程目录core_ext.py中会尝试在目录下或一级子目录下查找唯一的*.map找不到或找到多个会报错--output-file将输出写入指定文件而非标准输出子命令定义同样在 tools/idf_py_actions/core_ext.py 中size打印应用基本信息size-components打印组件级信息size-files打印源文件级信息。从 tools/idf_py_actions/core_ext.py 的size_target实现可以看到执行流程它会先设置ESP_IDF_SIZE_FORCE_TERMINAL1环境变量把--format/--output-file/--diff分别转为SIZE_OUTPUT_FORMAT/SIZE_OUTPUT_FILE/SIZE_DIFF_FILE环境变量随后先执行all目标构建工程使用自定义错误处理器抑制构建报错从而支持在溢出场景下继续再运行对应的 size 目标。源码中还有一处值得注意linux目标平台不支持idf.py size分析会打印 not supported for the linux target; skipping size analysis 后直接返回。这些环境变量最终在 tools/cmake/run_size_tool.cmake 中于构建时展开为esp_idf_size的命令行参数--format、--output-file、--diff、--archives/--files模式从而允许在不重新运行 CMake 配置的情况下动态修改格式与对比目标。其中size目标映射为默认模式内存类型汇总size-components目标映射为--archives模式size-files目标映射为--files模式。底层原理map 文件、链接脚本与工具调用链理解 IDF Size 的数据来源有助于判断报告数字的含义map 文件是唯一输入。在 tools/cmake/project.cmake 中构建系统通过-Wl,--cref在 map 文件中加入交叉引用表、通过-Wl,--defsymIDF_TARGET_target0注入一个符号供esp_idf_size识别目标芯片、并通过-Wl,--Mapmapfile启用 map 文件输出map 文件位于project/build/projectname.map三种粒度同一数据源。size、size-components、size-files三个 CMake 自定义目标都依赖 map 文件并调用同一个esp_idf_size工具见 tools/cmake/project.cmake只是通过--archives/--files切换聚合粒度Total 来自map 文件存储区 每芯片 YAML。如文档所述esp-idf-size为每个目标芯片内置 YAML 文件描述 TRM 中的内存类型范围再与 map 文件中的存储区范围做映射得出各内存类型的总容量Remain则为 Total 减去装载到该内存类型的输出段大小IDF Size 与体积优化配置联动。官方体积指标size metrics测试工程使用的共享配置可在 tools/test_apps/configs/sdkconfig.size_metrics 中看到如CONFIG_COMPILER_OPTIMIZATION_SIZEy、CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZEyCONFIG_COMPILER_NO_MERGE_CONSTANTS在 tools/cmakev2/project.cmake 中也会影响链接选项-fno-merge-constants相关处理。这表明 IDF Size 与编译/链接优化配置是配套使用的——想压缩体积先跑idf.py size-files定位大户再针对性调整menuconfig中的优化选项如CONFIG_COMPILER_OPTIMIZATION最后用--diff验证收益。实战小结结合文档与仓库源码可以把 IDF Size 的使用收敛为以下工作流日常体检构建后运行idf.py size关注 DRAM/IRAM 的Used [%]与Remain警惕接近 100% 的内存类型定位组件大户运行idf.py size-components找出贡献最大的静态库如libnet80211.a、libmbedcrypto.a判断是否可裁剪对应功能定位源文件大户运行idf.py size-files逐文件排查对二进制库中的对象如phy_chip_v7.o到 map 文件中查找完整路径以确认归属优化前后对比修改配置如切换-Os、关闭不需要的证书捆绑后用idf.py size --diff 参考工程量化收益链接失败应急出现region ... overflowed错误时直接运行idf_size.py build/projectname.map查看_overflow段定位超限源头。需要注意的是IDF Size 报告的是静态分配视角运行时堆的实际可用量还会受元数据、启动期分配等影响而进一步缩小这与 docs/zh_CN/api-guides/memory-types.rst 中关于 DRAM/IRAM 堆的描述一致。理解这一点才能把汇总表里的数字正确换算为真实可用的运行时内存。【免费下载链接】esp-idfEspressif IoT Development Framework. Official development framework for Espressif SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表