ESP32中的内存架构
组成
分为 SRAM0、SRAM1、SRAM2、RTC快速存储器、RTC慢速存储器,一共5个部分。
默认内存布局
SRAM 以两种方式使用:
- IRAM(Instruction Random Access Memory),指令存储,用作代码.text 段。
- DRAM(Data Random Access Memory),数据存储,用作.BSS 段、.Data 段和堆。
通常代码是在Flash也就是ROM中的,这里IRAM存放代码是因为RAM通常具有更高的访问速度,适合需要快速响应的代码(如中断处理程序、实时任务等)。
如何设置代码存放在IRAM中?使用关键字IRAM_ATTR
.
SRAM0 和 SRAM1 可以用作连续的 IRAM,而 SRAM1 和 SRAM2 可以用作连续的 DRAM 地址空间。但是默认情况下,ESP-IDF 会使用 SRAM1 作为 DRAM ,这是因为通常在应用程序中数据空间会比较紧缺。
注意:IRAM 和 DRAM 地址空间,地址生长的方向是相反的,仔细看上图的箭头所示。
IRAM 组织架构
典型IRAM组织架构
- Cache:32KB用作 CPU0 的高速缓存,32KB用作 CPU1 高速缓存
- Interrupt Vectors:中断向量
- text:程序中所有标记为放置在 IRAM 中的代码段
- Free IRAM:text 段之后的 IRAM 保持未使用状态,并添加到堆中
DRAM 组织架构
典型DRAM组织架构
DRAM空间的分配从 SRAM2 的末尾开始。
- Used by ROM:8KB(0x3FFA_E000–0x3FFA_FFFF),用作某些 ROM 内置函数的数据空间;
- data段:已初始化的数据段;
- bss段:未初始化的 BSS 段;
- Heap:剩余内存被配置为堆,典型的动态内存分配一般分配至该位置。
注意:堆中有两个区域(0x3FFE_0000–0x3FFE_0440 - 共 1088 字节)和(0x3FFE_3F20–0x3FFE_4350 - 共 1072 字节)供 ROM 代码存放数据。这些区域被标记为保留,并且堆分配器不会从这些区域分配内存。
启用蓝牙功能之后的 DRAM 组织结构
启用蓝牙(BT)功能后,蓝牙控制器(软件和硬件)需要使用专用的数据空间,即0x3FFB_0000–0x3FFB_DB5C 之间的 54KB。
当应用程序仅使用低功耗蓝牙(BLE)功能时,可以将 BT 控制器内存的一部分交还给堆。释放并添加到堆中的内存大小约为 19KB。
启用跟踪调试空间之后 DRAM 组织结构
应用程序级的跟踪调试(Trace)启用以后,它将在 DRAM 的末尾保留一个固定为 32KB 的内存空间。