ESP32-C3的存储器类型

本文主要参考ESP-IDF编程指南,一点小记录。

ESP32-C3的存储器有:

ESP32-C3的存储器类型_第1张图片

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)

ESP32-C3的存储器类型_第2张图片

内部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)

ESP32-C3的存储器类型_第3张图片

你可能感兴趣的:(ESP32,存储器)