本文主要参考ESP-IDF编程指南,一点小记录。
ESP32-C3的存储器有:
ESP-IDF 区分了指令总线(IRAM、IROM、RTC FAST memory)和数据总线 (DRAM、DROM)。
内部SRAM的一部分是指令RAM(IRAM)。那为什么要把指令放在RAM中,就是为了加快执行速度, 提高代码的性能。比如可以把中断的代码放到IRAM中,简单的做法就是,使用 IRAM_ATTR
宏在源代码中指定需要放入 IRAM 的代码,如:
#include "esp_attr.h"
void IRAM_ATTR gpio_isr_handler(void* arg)
{
// ...
}
如何操作具体参考: 存储器类型 - ESP32-C3 - — ESP-IDF 编程指南 latest 文档 (espressif.com)
内部SRAM的另外一部分是数据RAM(DRAM)。非常量静态数据(.data 段)和零初始化数据(.bss 段)由链接器放入内部 SRAM 作为数据存储。内部 SRAM 中不用于指令 RAM 的部分都会作为 数据RAM供静态数据和动态分配(堆)使用。
内部ROM和外部Flash的一部分构成了指令ROM(IROM)。由于 IRAM 空间有限,应用程序的大部分二进制代码都需要放入 IROM 中。其中,内部ROM存储了bootloader等出厂固化的程序,我们是无法改变的;而Flash则存储了用户程序。
内部ROM和外部Flash的一部分构成了数据ROM(DROM)。这里的数据主要是常量。除此之外,可可以通过分区表去设定Flash的分区,存储用户自定义的数据。
具体来看一个程序的编译结果:
$ idf.py size
[...]
Total sizes:
Used stat D/IRAM: 53743 bytes ( 122385 remain, 30.5% used)
.data size: 6504 bytes
.bss size: 1984 bytes
.text size: 44228 bytes
.vectors size: 1027 bytes
Used Flash size : 118879 bytes
.text: 83467 bytes
.rodata: 35156 bytes
Total image size: 170638 bytes (.bin may be padded larger)
可以看到.bss和.data以及.vector放在了DRAM里,小部分代码.text放在了IRAM里,两部分共占用了内部SRAM的53743字节,剩下的空间用作堆。
.rodata是只读数据也就是常量放在了DROM里,大部分代码.text放在了IROM里,两部分共占用了118879字节。
详细介绍:最小化二进制文件大小 - ESP32-S3 - — ESP-IDF 编程指南 latest 文档 (espressif.com)