深入理解 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)片上 RAMIRAM + 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 修饰符:

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 内存架构示意图

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

4. 什么时候用 IRAM?

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

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

方法:使用 IRAM_ATTR

void IRAM_ATTR gpio_isr_handler(void *arg) {// 高速执行的 GPIO 中断
}

5. 什么时候用 DRAM?

存放变量

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

方法:直接使用全局变量

int counter = 0;  // 存放在 DRAM

6.总结

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

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

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

void IRAM_ATTR gpio_isr_handler(void *arg) { ... }

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

const char *string = "Hello";  // 存入 DROM,节省 DRAM

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/34212.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux - 基础IO之操作与文件描述符全解析:从C语言到系统调用底层实现

目录 1.回顾c语言中所学的文件 2.提炼对文件的理解&#xff08;linux基础io第一阶段的学习&#xff09; a.在操作系统内部&#xff0c;一个进程和一个被打开的文件&#xff0c;他们到后面会变成两种对象之间的指针关系。 b.文件 属性 内容 c.在c语言中,以w的方式打开文件…

【A2DP】深入解读A2DP中通用访问配置文件(GAP)的互操作性要求

目录 一、模式支持要求 1.1 发现模式 1.2 连接模式 1.3 绑定模式 1.4 模式间依赖关系总结 1.5 注意事项 1.6 协议设计深层逻辑 二、安全机制&#xff08;Security Aspects&#xff09; 三、空闲模式操作&#xff08;Idle Mode Procedures&#xff09; 3.1 支持要求 …

python 入门教程 window 10 环境下安装pyenv

python的环境配置方法很多&#xff0c;由于python有两个大版本&#xff0c;很多时候需要切换某个固定的版本才能运行三方包&#xff0c;所以推荐使用pyenv 配置python 环境变量 pyenv 的安装 安装方法&#xff1a; Invoke-WebRequest -UseBasicParsing -Uri "https://r…

【fNIRS可视化学习1】基于NIRS-SPM进行光极可视化并计算通道坐标

一、前言 功能性近红外光谱(fNIRS)是一种无创的脑功能成像技术。在fNIRS研究中&#xff0c;光极的空间定位和通道坐标的计算至关重要。 1.光极可视化 光极可视化的重要性我就不赘述了&#xff0c;它可以直观检查probe设计的合理性&#xff0c;确认光极覆盖目标脑区&#xff0c…

Vue.js 中 class 和 style 绑定的全面解析

目录 引言 6.1 v-bind 指令 介绍 使用方法 6.2 绑定 HTML class 介绍 用法 6.3 绑定内联样式 介绍 用法 6.4 实战&#xff1a;制作消息提示框 介绍 用法 总结 引言 在Vue.js构建用户界面的宏伟蓝图里&#xff0c;样式的动态呈现与交互性的完美融合是吸引用户目光…

【红黑树】—— 我与C++的不解之缘(二十五)

前言 学习了avl树&#xff0c;现在来学习红黑树。 一、什么是红黑树 红黑树是一颗平衡二叉搜索树&#xff0c;它每一个节点增加了一个存储位表示节点的颜色&#xff0c;可以是红色或者黑色。 相比较于AVL树&#xff0c;红黑树也是一个自平衡二叉搜索树&#xff0c;但是它与AVL树…

SFT数据处理部分的思考

SFT数据及处理的业内共识 1&#xff0e;prompt的质量和多样性远重要于数据量级&#xff0c;微调一个 30 b 量级的base model只需要 10 w 量级的数据即可 参考&#xff1a;《LIMA&#xff1a;Less Is More for Alignment》 2&#xff0e;合成数据很重要&#xff01;一般需要通过…

Python(学习一)

做网站有成熟的框架像FLASK、DJANGO、TORNADO&#xff0c;写爬虫有好用到哭的REQUESTS&#xff0c;还有强大到没盆友的SCRAPY 随着NUMPY、SCIPY、MATLOTLIB等众多第三方模块的开发和完善&#xff0c;不仅支持py支持各种数学运算&#xff0c;还可以绘制高质量的2D和3D图像&…

ArcGIS Pro将有文字标注底图切换为无标注底图(在线地图图源)

今天介绍一下在ArcGIS Pro将有标注的地形底图换成无标注的底图。 大家在这项目底图时候会经常调用ArcGIS Pro自带的地形图&#xff0c;但是这个地形图自带是有注记的&#xff0c;如下图。 如何更改&#xff0c;才可以调用无文字注记的呢&#xff1f; 对于一个已经切好图的有注记…

Linux第三次练习

1、创建根目录结构中的所有的普通文件 首先在根目录下面新创建一个test目录&#xff0c;然后将查找到的普通文件新建到test目录下 2、列出所有账号的账号名 3、将/etc/passwd中内容按照冒号隔开的第三个字符从大到小排序后输出所有内容 4、列出/etc/passwd中的第20行-25行内容…

[CISCN 2022 初赛]ezpop(没成功复现)

打开在线环境可以看到&#xff1a; 记得之前做过一个类似的就是有点像照着漏洞去复现。应该可以直接在网上找到链子去打。 www.zip查看路由是 Index/test&#xff0c;然后 post 传参 a&#xff1a; exp&#xff08;参考了别的大神的wp&#xff09;&#xff1a; <?php //…

技术-NBIOT

是什么&#xff1f; 窄带物联网&#xff08;Narrow Band Internet of Things, NB-IoT&#xff09;成为万物互联网络的一个重要分支支持低功耗设备在广域网的蜂窝数据连接&#xff0c;也被叫作低功耗广域网(LPWAN)NB-IoT支持待机时间长、对网络连接要求较高设备的高效连接NB-Io…

Spring @Bean注解使用场景二

bean:最近在写一篇让Successfactors顾问都能搞明白的sso的逻辑的文章&#xff0c;所以一致在研究IAS的saml2.0的协议&#xff0c;希望用代码去解释SP、idp的一些概念&#xff0c;让顾问了解SSO与saml的关系&#xff0c;在github找代码的时候发现一些代码的调用关系很难理解&…

pip install和conda install的区别

这里写目录标题 一、什么是 Python 依赖&#xff08;Python Dependencies&#xff09;&#xff1f;1. 依赖的作用2. 如何管理 Python 依赖3. 依赖管理问题4. 依赖锁定总结 二、使用pip安装包venv隔离环境方法 1&#xff1a;使用 venv&#xff08;推荐&#xff09;创建虚拟环境激…

R语言高效数据处理-自定义EXCEL数据排版

注&#xff1a;以下代码均为实际数据处理中的笔记摘录&#xff0c;所以很零散 1、自定义excel表数据输出格式、布局 在实际数据处理中为了提升效率&#xff0c;将Excel报表交付给需求方时减少手动调整的环节很有必要 #1.1设置表头格式 header_style <- createStyle(font…

Word 小黑第4套

对应大猫41 上下日期是一起变动的&#xff0c;删掉第一个&#xff0c;第二个日期格式&#xff08;文件 -选项 -自定义功能区 -选上开发工具&#xff09; 点开发工具 -属性 选择相应的日期格式&#xff09; 修改标题样式时&#xff0c;标题三只有点标题二时才会显示 右击正文样…

酒店宾馆IPTV数字电视系统:创新宾客体验,引领智慧服务新潮流

酒店宾馆IPTV数字电视系统&#xff1a;创新宾客体验&#xff0c;引领智慧服务新潮流 北京海特伟业科技有限公司任洪卓于2025年3月15日发布 随着智慧酒店的不断发展&#xff0c;宾客对于酒店内的娱乐和信息服务需求日益多样化&#xff0c;传统的电视服务已难以满足现代宾客的高…

jupyter无法转换为PDF,HTMLnbconvert failed: Pandoc wasn‘t found.

无法转为PDF 手动下载工具 https://github.com/jgm/pandoc/releases/tag/3.6.3 似乎跟我想的不大一样&#xff0c;还有新的报错 https://nbconvert.readthedocs.io/en/latest/install.html#installing-tex 不知道下的啥玩意儿 sudo apt-get install texlive-xetex texlive-fon…

如何在 VS编译器上使用 C99规定的变长数组------使用Clang工具

VS编译器默认处理代码的工具是 MSVC&#xff0c;而MSVC工具是无法处理变长数组的&#xff0c;这个时候我们就要换一个处理代码的工具了----Clang 1 int n 9; 2 int arr[n];// 数组长度可以拟定1.打开 Visual Stdudio Intaller 2.点击修改&#xff0c;鼠标下滑找到>>使用…

vue echarts封装使用

echarts 尺寸自动调节 resize.js 柱状图 components/dashboard/lineChart.vue <template><div :class"className" :style"{height:height,width:width}" /> </template><script> import echarts from echarts require(echarts/…