所有的内部存储器、外部存储器以及外设都分布在 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