没志青年
发布于 2025-07-22 / 16 阅读
0

ESP32 存储器组织结构

所有的内部存储器、外部存储器以及外设都分布在 CPU 的总线上。

存储器类型 - ESP32-S3 - — ESP-IDF 编程指南 v5.5 文档

ESP32中的内存架构_esp32的代码存在哪里-CSDN博客

(68 封私信 / 80 条消息) ESP32 程序的内存模型 - 知乎

系统结构与地址映射结构

该图反应了不同存储器支持的地址空间,以及数据的流向。

  • 红色五角星:可以被协处理器访问。

  • 灰色背景:地址空间不可用。

STM32 使用 ARM Cortex-M 核心,CPU 为冯·诺依曼架构,指令和数据共同一条总线。

ESP32 使用 Xtensa LX 核心,CPU 为哈佛架构,指令总线和数据总线是分开的。

  • 内部 RAM:CPU 从这里读取并执行指令,即执行代码的地方,程序的 text 段

  • 内部 DRAM:也可以存放代码,但主要是一些数据:BSS 段、Data 段、Heap 堆内存

  • 内部 ROM:在ESP32芯片出厂时就被固化好的只读存储器。用户无法修改其内容。

  • 外部 Flash,相当于硬盘,代码烧录到外部 Flash 中。

  • 外部 PSRAM:拓展内部 DRAM 的大小。比内部的 RAM 速度慢,但比外接 Flash 快。

虚拟地址映射:

CPU 访问外部 Flash 和 PSRAM 时,并不是直接访问物理设备,而是访问一个特定的虚拟地址范围。

当访问虚拟地址时,内存映射单元会翻译地址并操作物理的设备,在写代码层面感觉像是直接操作内存一样。

缓存映射:

在快的CPU和慢的内存之间建立的一个缓存,基于时间局部性和空间局部性原理:

  • 时间局部性:如果一个数据被访问了,那么它很快很可能再次被访问。

  • 空间局部性:如果一个数据被访问了,那么它附近的数据很快也很可能被访问。

堆内存分配 - ESP32-S3 - — ESP-IDF 编程指南 v5.5 文档

ESP32-IDF 分配内存:

头文件:

#include "esp_heap_caps.h"

获取 DRAM 剩余字节数:

heap_caps_get_free_size(MALLOC_CAP_8BIT)

malloc 内部调用 heap_caps_malloc_default(size) 函数,使用 MALLOC_CAP_DEFAULT,最小单位为字节。

void *heap_caps_malloc(size_t size, uint32_t caps)


// 示例:



caps:MALLOC_CAP_开头的标志

  • MALLOC_CAP_DEFAULT:不指定是内部还是外部的,优先内部 DRAM -> 次选外部 PSRAM (如果可用且内部不足)

  • MALLOC_CAP_INTERNAL:使用内部 DRAM

  • MALLOC_CAP_SPIRAM:使用外部 SPRAM

  • MALLOC_CAP_DMA:这块地址是给 DMA 用的,ESP-IDF 会做一些处理

  • MALLOC_CAP_8BIT:内存访问能力,按照字节访问。(这个不太懂,什么内部有些RAM只能32位,什么对齐报错、总线错误,什么性能下降啥的,还有Flash等硬件不支持啥的)

使用 malloc() 和 heap_caps_malloc() 分配的内存,都可以使用 free() 释放。



// 在 ESP-IDF 中,free 和 heap_caps_free 等效
void heap_caps_free(void *ptr)



// 普通 malloc,
void *buf = malloc(1024);

// 使用 heap_caps_malloc 指定内存类型,使用内部 DRAM
void *buf2 = heap_caps_malloc(1024, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT);

// 分配 PSRAM
void *buf = heap_caps_malloc(1024, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);

// 如果希望在 DMA 中使用 PSRAM,需要加 DMA 标记
void *dma_buf = heap_caps_malloc(1024, MALLOC_CAP_SPIRAM | MALLOC_CAP_DMA);

存储器组织

内部存储器

  • 384 KB 内部 ROM:只读存储器,不可编程。

  • 512 KB 内部 SRAM

  • 8 KB RTC 快速存储器

  • 8 KB RTC 慢速存储器

SRAM 布局:

虽然SRAM1既可以又可以,但是ESP-IDF默认作为DRAM,因为

IRAM 和 DRAM 地址空间,地址范围的方向是相反的。

IRAM 组织架构:

DRAM组织架构:

当应用程序配置为单核模式时,CPU1 不工作并且不启用 CPU1 Cache。在这种情况下,CPU1 Cache 的空间(0x40078000–0x4007FFFF)将被添加到堆中。

启用蓝牙功能后的 DRAM 内存结构:

启用跟踪调试功能后的 DRAM 内存结构:

外部存储器

ESP32-S3 支持以 SPI、Dual SPI、Quad SPI、Octal SPI、QPI、OPI 等接口形式连接 Flash 和片外 RAM。

  • 最大支持 1 GB 片外 Flash

  • 最大支持 1 GB 片外 RAM

IRAM 安全

为什么要考虑 IRAM 安全?

什么时候考虑 IRAM 安全?

(1)如果在注册中断处理程序时使用了 ESP_INTR_FLAG_IRAM,则中断处理程序必须要放入 IRAM。

参考:SPI1 flash 并发约束 - ESP32-S3 - — ESP-IDF 编程指南 v5.5 文档

(2)

对时间要求较高、或者需要操作Flash

如何放入 IRAM 区域?