深入理解 Xtensa 架构 ESP32 内存架构(SRAM、IRAM、IROM、DRAM、DROM详解)

ESP32 及其他 Xtensa 架构 MCU 中,内存被划分为不同的区域,以优化性能和存储管理。这些内存区域包括 SRAM, IRAM, DRAM, IROM, DROM,它们各有用途。


1. 内存区域总览

ESP32 的内存架构主要由:

  • SRAM(Static RAM)
  • IRAM(Instruction RAM)
  • IROM(Instruction ROM)
  • DRAM(Data RAM)
  • DROM(Data ROM)

组成,每个部分有特定的用途。

名称 作用 存储内容 特性
SRAM(Static RAM) 片上 RAM IRAM + DRAM 速度快,供 CPU 使用
IRAM(Instruction RAM) 指令 RAM 存放可执行代码(运行时加载) 运行时可修改
DRAM(Data RAM) 数据 RAM 存放 .bss(未初始化数据)、.data(已初始化数据) 运行时可修改
IROM(Instruction ROM) 指令 ROM 存放 Flash 里的 .text(程序代码) 运行时不可修改
DROM(Data ROM) 数据 ROM 存放 Flash 里的 .rodata(只读数据) 运行时不可修改

2. 详细解析

2.1 SRAM(Static RAM,片上静态 RAM)

  • SRAM 是 MCU 内部的 RAM,供 CPU 使用
  • IRAM(存放指令)+ DRAM(存放数据) 组成
  • 运行速度快(比外部 Flash 快很多)

SRAM 的划分

SRAM0 + SRAM1(用于 IRAM 和 DRAM)

  • IRAM:指令 RAM ,存放 可执行代码
  • DRAM:数据 RAM ,存放 数据(变量、堆、栈)

SRAM2(仅用于 DRAM)

  • 仅存放 数据

2.2 IRAM(Instruction RAM,指令 RAM)

  • 存放 可执行代码
  • 用于高实时性任务 ,比如 中断处理
  • 代码必须从 Flash 加载到 IRAM 才能运行
  • IRAM 里的代码可以被修改

🔹 示例:

ESP-IDF 里,想要让某个函数运行在 IRAM ,需要使用 IRAM_ATTR 修饰符:

c 复制代码
void IRAM_ATTR gpio_isr_handler(void *arg) {
    // GPIO 中断处理(放入 IRAM,提高执行速度)
}

2.3 DRAM(Data RAM,数据 RAM)

  • 存放 数据(变量、栈、堆)
  • DRAM 里的数据 可读可写
  • 运行时 CPU 从 DRAM 读取变量数据

DRAM 里存放的内容:

  • .data(已初始化的全局变量)
  • .bss(未初始化的全局变量)
  • 堆(Heap)
  • 栈(Stack)

简单理解DRAM 里存放的是程序运行时需要用的数据,比如全局变量、栈、堆等


2.4 IROM(Instruction ROM,指令 ROM)

  • 存放 Flash 里的程序代码(.text)
  • 代码不能被修改,只能执行
  • 运行时,CPU 从 Flash 直接取指令执行

IROM 是存放在 Flash 里的代码,只有一部分需要提高执行速度的代码会被拷贝到 IRAM 执行


2.5 DROM(Data ROM,数据 ROM)

  • 存放 Flash 里的只读数据(.rodata)
  • 运行时 CPU 直接从 Flash 读取
  • 不能修改

DROM 里存放的内容:

  • .rodata(只读数据,如 const char[] 字符串)
  • 其他只读配置数据

简单理解DROM 是存放在 Flash 里的只读数据(比如 const char *string = "Hello"


3. ESP32 内存架构示意图

plaintext 复制代码
+-------------------------+  0x40000000  (IROM)
|  Flash (代码)           |  存放 .text(程序代码)
+-------------------------+
|  Flash (只读数据)       |  存放 .rodata(只读数据)  <--- DROM
+-------------------------+
|  IRAM (指令 RAM)       |  运行时加载的代码  <--- IRAM
+-------------------------+  0x3F800000  (SRAM)
|  DRAM (数据 RAM)       |  存放变量、堆、栈  <--- DRAM
+-------------------------+

4. 什么时候用 IRAM?

需要高实时性,避免 Flash 访问延迟

  • 中断处理(ISR)
  • WiFi、蓝牙实时任务
  • 定时器回调

方法:使用 IRAM_ATTR

c 复制代码
void IRAM_ATTR gpio_isr_handler(void *arg) {
    // 高速执行的 GPIO 中断
}

5. 什么时候用 DRAM?

存放变量

  • 全局变量
  • 堆(malloc 分配)
  • 栈(局部变量、函数参数)

方法:直接使用全局变量

c 复制代码
int counter = 0;  // 存放在 DRAM

6.总结

为什么有 IRAM 和 IROM? 👉 IROM 在 Flash,CPU 取指令慢,所以部分代码(中断、WiFi 任务)需要拷贝到 IRAM 加速执行。

为什么有 DRAM 和 DROM? 👉 DRAM 是可变数据,DROM 是 Flash 里的只读数据。

如何让代码运行在 IRAM? 👉 使用 IRAM_ATTR 修饰符:

c 复制代码
void IRAM_ATTR gpio_isr_handler(void *arg) { ... }

如何减少 RAM 占用? 👉 const 变量存放在 Flash

c 复制代码
const char *string = "Hello";  // 存入 DROM,节省 DRAM
相关推荐
自由的疯15 分钟前
在 Java IDEA 中使用 DeepSeek 详解
java·后端·架构
就是帅我不改20 分钟前
从“写循环”到“写思想”:Java Stream 流的高级实战与底层原理剖析
后端·面试·架构
一杯科技拿铁1 小时前
提升 LLM 推理效率的秘密武器:LM Cache 架构与实践
架构·llm
文火冰糖的硅基工坊2 小时前
[创业之路-551]:党、政府、经济、军队、文化、学术、社会七大领域的社会角色与职务层次结构(宏观-中观-微观)
系统架构·跨学科融合
云边有个稻草人3 小时前
KingbaseES:一体化架构与多层防护,支撑业务的持续稳定运行与扩展
架构·国产数据库
喂完待续13 小时前
Apache Hudi:数据湖的实时革命
大数据·数据仓库·分布式·架构·apache·数据库架构
╰⋛⋋⊱⋋翅膀⋌⊰⋌⋚╯14 小时前
ESP32-S3_ES8311音频输出使用
esp32
高阳言编程18 小时前
4. 存储体系
架构
Galaxy在掘金18 小时前
从业8年,谈谈我认知的后端架构之路-1
java·架构