深入解析ESP32C3(2)- 存储类型和地址空间

ESP32C3芯片的存储资源

• 384 KB 的ROM:用于程序启动和内核功能调用
• 400 KB 片上SRAM:用于数据和指令存储,时钟频率可配置,最大160 MHz。400 KB SRAM 中,有16 KB 配置为cache 专用
• RTC 快速存储器:为8 KB 的SRAM,可被主CPU 访问,在Deep-sleep 模式下可以保存数据
• 4 Kbit 的eFuse:其中1792 位保留给您使用,例如用于存储密钥和设备ID
• 支持最大16 MB 片外flash。(部分ESP32C3型号将flash封装内置)

系统结构和地址映射结构:

从上图可以看出,ESP32C3的存储介质,不管是类型,还是用途,都比较多的。ESP32C3是一个典型的哈弗结构处理器,拥有独立的数据总线和指令总线,数据地址空间和指令地址空间是分开的;即使是相同的存储位置,数据地址和指令地址是不一样的,即同序访问,如红色标注的ROM1、RAM1。图片中的颜色标注字体是为了更直观地理解内置ROM/SRAM的用途,我特意添加的。与常见的单片机不同,ROM/SRAM的用途不是单一的定义,程序不能任意使用所有内存,而是必须按硬性的地址映射来分配用途,见下表。

ROM0 :只允许指令总线访问,即固件程序存放于此
ROM1 :数据/指令总线都能访问,区别在于数据总线没有执行权限,只有读权限
SRAM0 :不允许数据总线访问,这块作为访问外部FLASH的缓存(CACHE)
SRAM1 :允许任意访问,且权限没有限制
RTC FastRAM :同SRAM1,区别在于它可用于深度休眠,保证数据不丢失

当然,从芯片开发者的角度来看,我们不必关心内置ROM,因为ROM已经固化了厂商的出厂固件,比如芯片的下载功能、启动模式等功能都基于此 ,出厂固件也称为第一级启动引导PBL(Primary Bootloader)。
接下来,分析下APP程序是如何使用片内RAM的。

APP程序的内存空间分布

以测试用例blink为例,编译完成后,可用命令直接查看blink.bin的内存占用情况、加载段的信息。

###查看blink.bin所需的RAM、ROM空间大小
PS G:\workspace\espressif\blink> idf.py size
Executing action: size
... ... ...
Total sizes:
Used stat D/IRAM:   54154 bytes ( 267142 remain, 16.9% used)
      .data size:    4504 bytes  #非常量静态数据
      .bss  size:    3688 bytes  #未初始化的数据
      .text size:   45962 bytes  #程序代码
Used Flash size :  140940 bytes
           .text:  101092 bytes  #程序代码
         .rodata:   39592 bytes  #只读数据
Total image size:  191406 bytes (.bin may be padded larger)

###查看blink.bin文件内各个内存段的大小、加载地址,以及内存段的类型
PS G:\workspace\espressif\blink> esptool.py --chip esp32c3 image_info G:/workspace/espressif/blink/build/blink.bin
... ... ...
Segment 1: len 0x09ba8 load 0x3c020020 file_offs 0x00000018 [DROM]
Segment 2: len 0x01198 load 0x3fc8b400 file_offs 0x00009bc8 [DRAM,BYTE_ACCESSIBLE]
Segment 3: len 0x052a8 load 0x40380000 file_offs 0x0000ad68 [IRAM]
Segment 4: len 0x18ae4 load 0x42000020 file_offs 0x00010018 [IROM]
Segment 5: len 0x060e4 load 0x403852a8 file_offs 0x00028b04 [IRAM]
Checksum: 6a (valid)
Validation Hash: 9a9fb7ee6e46797dcbf956965a0f9b6022122636ebd1d85606e455d19d67d043 (valid)

###以下是ESP32C3板子启动后加载blink.bin的日志
I (83) boot: End of partition table
I (87) esp_image: segment 0: paddr=00010020 vaddr=3c020020 size=09ba8h ( 39848) map
I (102) esp_image: segment 1: paddr=00019bd0 vaddr=3fc8b400 size=01198h (  4504) load
I (104) esp_image: segment 2: paddr=0001ad70 vaddr=40380000 size=052a8h ( 21160) load
I (116) esp_image: segment 3: paddr=00020020 vaddr=42000020 size=18ae4h (101092) map
I (137) esp_image: segment 4: paddr=00038b0c vaddr=403852a8 size=060e4h ( 24804) load
I (145) boot: Loaded app from partition at offset 0x10000

APP程序需要占用一定的ROM、RAM;ROM用于存放程序指令和只读的数据,RAM可存放数据,也可存放程序。
对于ESP32C3芯片,ROM位于片外的FLASH存储空间,程序不能直接在外存储器上运行,而是先通过Cache 访问将外存储器由MMU映射到虚地址空间(见地址映射结构图),APP内存段的加载地址就在该虚地址空间中;RAM则位于片内SRAM、RTC Fast RAM,按总线访问,可分为IRAM(指令RAM)和DRAM(数据RAM)。
IDF默认为APP程序指定的RAM是SRAM,但我们可以根据实际需求(例如只有在RTC Fast RAM的代码和数据才能在deep休眠后不丢失),去改变程序代码或数据的分配位置。IDF开发平台提供了一个链接器脚本生成机制,这应该是乐鑫官方独创的。

自定义分配代码/数据到RAM

IDF提供了两种方式:

方式一:属性宏

宏定义文件位于\components\esp_common\include\esp_attr.h

// Forces code into IRAM instead of flash
#define IRAM_ATTR _SECTION_ATTR_IMPL(".iram1", __COUNTER__)
// Forces data into DRAM instead of flash
#define DRAM_ATTR _SECTION_ATTR_IMPL(".dram1", __COUNTER__)

在定义变量或声明函数时,设定属性宏,就可以告诉编译器在链接阶段分配相应的存储类型中。

#常量数据定义在DRAM,而不是FLASH,因为该常量被用于non-flash-safe中断函数
__NOINIT_ATTR uint32_t noinit_data; 

#使用IRAM_ATTR 宏在源代码中指定需要放入IRAM 的代码
void IRAM_ATTR gpio_isr_handler(void* arg)
{
// ...
//= noinit_data
}

方式二:链接器脚本生成机制

方式一的使用比较简单方便,但局限也很明显,处理不了整个目标源文件或复杂的函数调用关系。
链接器脚本生成机制定义了一套规则,可以让用户指定代码和数据在ESP-IDF 组件中的存放区域。IDF平台中,扩展名(.lf)的文件,就是这套规则的脚本。
 编译APP时,使用的默认脚本如下: components\esp_system\app.lf

[scheme:default]
entries:
    if APP_BUILD_USE_FLASH_SECTIONS = y:
        text -> flash_text
        rodata -> flash_rodata
    else:
        text -> iram0_text
        rodata -> dram0_data
    data -> dram0_data
    bss -> dram0_bss
    common -> dram0_bss
    if ESP_ALLOW_BSS_SEG_EXTERNAL_MEMORY = y:
        extram_bss -> extern_ram
    else:
        extram_bss -> dram0_bss
    legacy_bss -> dram0_bss
    iram -> iram0_text
    iram_data -> iram0_data
    iram_bss -> iram0_bss
    dram -> dram0_data
    rtc_text -> rtc_text
    rtc_data -> rtc_data
    rtc_rodata -> rtc_data
    rtc_bss -> rtc_bss

[scheme:rtc]
entries:
    text -> rtc_text
    data -> rtc_data
    rodata -> rtc_data
    bss -> rtc_bss
    common -> rtc_bss

[scheme:noflash]
entries:
    text -> iram0_text
    rodata -> dram0_data

[scheme:noflash_data]
entries:
    rodata -> dram0_data

[scheme:noflash_text]
entries:
    text -> iram0_text

[mapping:default]
archive: *
entries:
    * (default)

 机制的具体细节,请直接看官网编程指南-链接器脚本生成机制。

与存储关联的内容,还有权限管理(PMS),本次就不在此展开。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VC++中使用OpenCV进行形状和轮廓检测

VC中使用OpenCV进行形状和轮廓检测 在VC中使用OpenCV进行形状和轮廓检测,轮廓是形状分析以及物体检测和识别的有用工具。如下面的图像中Shapes.png中有三角形、矩形、正方形、圆形等,我们如何去区分不同的形状,并且根据轮廓进行检测呢&#…

初学python系列: pandas操作excel

媳妇工作中经常用到excel处理,想用python处理excel更高效,所以自学了python,觉得python比Java还是简单多了,没有变量类型声明,比Java也就多了元组,各种库很丰富。 需求是: 汇总两个excel中 列&…

【MySQL】一文总结MVCC多版本并发控制

目录 MVCC 介绍当前读和快照读当前读快照读 MVCC 原理解析隐式字段Undo Log版本链Read ViewRead View 可见性原则 RC 和 RR 下的 Read ViewRC 下的 Read ViewRR 下的 Read View小结RR 级别下能否防止幻读总结 MVCC 介绍 在当今高度并发的数据库环境中,有效的并发控…

系统架构设计师教程(十二)信息系统架构设计理论与实践

信息系统架构设计理论与实践 12.1 信息系统架构基本概念及发展12.1.1 信息系统架构的概述12.1.2 信息系统架构的发展12.1.3 信息系统架构的定义 12.2 信息系统架构12.2.1 架构风格12.2.2 信息系统架构分类12.2.3 信息系统架构的一般原理12.2.4 信息系统常用4种架构模型12.2.5 企…

flink结合Yarn进行部署

1. 什么是Yarn模式部署Flink 独立(Standalone)模式由 Flink 自身提供资源,无需其他框架,这种方式降低了和其他第三方资源框架的耦合性,独立性非常强。但我们知道,Flink 是大数据计算框架,不是资…

[娱乐]索尼电视安装Kodi

索尼电视不能直接apk安装kodi应用 android studio安装后附带 abd, 路径 C:\Users\[yourname]\AppuoData\Local\Android\Sdk\platform-tools\adb.exe安卓电视点击内部版本号,启用开发者模式 adb 连接索尼安卓电视,记得电视上运行调试 abi选…

Vue——计算属性

文章目录 计算属性computed 计算属性 vs methods 方法计算属性完整写法 综合案例:成绩案例 计算属性 概念:基于现有的数据,计算出来的新属性。依赖的数据变化,自动重新计算 语法: ①声明computed配置项中,一个计算属性…

stable diffuison的安装和使用

stable diffuison的安装和使用 简单介绍 Stable Diffusion是一个深度学习文本到图像的生成模型,它可以根据文本描述生成详细的图像。这个模型主要应用于文本生成图像的场景中,通过给定的文本提示词,模型会输出一张与提示词相匹配的图片。 S…

C++提高编程---模板---类模板

目录 一、类模板 1.模板 2.类模板的作用 3.语法 4.声明 二、类模板和函数模板的区别 三、类模板中成员函数的创建时机 四、类模板对象做函数参数 五、类模板与继承 六、类模板成员函数类外实现 七、类模板分文件编写 八、类模板与友元 九、类模板案例 一、类模板 …

HTML CSS 发光字头特效

效果展示&#xff1a; 代码&#xff1a; <html><head> </head><style>*{margin: 0;padding: 0;}body {text-align: center;}h1{/* border: 3px solid rgb(201, 201, 201); */margin-bottom: 20px;}.hcqFont {position: relative;letter-spacing: 0.07…

数据结构【DS】Ch8 排序

文章目录 插入排序选择排序归并&基数外部排序 插入排序 交换排序 选择排序 归并&基数 外部排序

电脑可以连接wifi,甚至可以qq聊天,但就是不能用浏览器上网,一直显示未检测出入户网线的解决方案

今天回到家&#xff0c;准备办公却发现电脑可以连接wifi&#xff0c;甚至可以qq聊天&#xff0c;但就是不能用浏览器上网&#xff0c;一直显示未检测出入户网线的解决方案&#xff0c;小白也可以看懂 以下有几种解决方案&#xff0c;不妨都试试&#xff0c;估计可以解决95%的相…

【C语言基础篇】结构控制(下)转向语句break、continue、goto、return

文章目录 一、break语句 1. break在 while 循环中 2. break在 for 循环中 3. break在 do…while 循环中 4. break在 switch 语句中 5. break 总结 二、continue语句 1. continue在 while 循环中 2. continue在 for 循环中 3. continue在 do...while 循环中 4. con…

PY调包侠——Collections高效库

一、【写在前面】 PY是一个调包侠语言&#xff0c;多学一个库可以提高计算速度。Collections提供了各种数据类型和集合工具&#xff0c;可以很方便的处理各种数据结构。如果您有刷力扣的习惯&#xff0c;可以经常看到Collections和itertools的身影&#xff0c;经常用这两个可以…

【数据结构】二叉树相关oj题(一)

目录 1、二叉树的构建及遍历 1.1、题目介绍 1.2、解题思路 1.3、代码描述 1.4、完整代码 2、二叉树的层次遍历 2.1、题目介绍 2.2、解题思路 2.3、代码描述 2.4、完整代码 1、二叉树的构建及遍历 1.1、题目介绍 原题链接&#xff1a;KY11 二叉树构建及遍历_牛客题霸…

ElasticSearch 7.x现网运行问题汇集1

问题描述&#xff1a; 现网ElasticSearch health状态变为red&#xff0c;有分片无法assign。如下摘录explain的结果部分&#xff1a; "note": "No shard was specified in the explain API request, so this response explains a randomly chosen unassigned s…

docker 部署 sentinel

docker 部署 sentinel 环境安装 拉取镜像 目前稳定的版本是1.8.0 docker pull bladex/sentinel-dashboard:1.8.0启动服务 docker run --name sentinel -p 8858:8858 -td bladex/sentinel-dashboard:1.8.0登录 登录的时候账号和密码都是sentinel

openGauss学习笔记-203 openGauss 数据库运维-常见故障定位案例-修改索引时只调用索引名提示索引不存在

文章目录 openGauss学习笔记-203 openGauss 数据库运维-常见故障定位案例-修改索引时只调用索引名提示索引不存在203.1 修改索引时只调用索引名提示索引不存在203.1.1 问题现象203.1.2 原因分析203.1.3 处理办法 openGauss学习笔记-203 openGauss 数据库运维-常见故障定位案例-…

modelscope下载模型

# 私有模型下载&#xff0c;前提是您有响应模型权限 方法1 git lfs install git clone http://oauth2:your_git_tokenwww.modelscope.cn/<namespace>/<model-name>.git 如何获取git token 用您的账号登录https://www.modelscope.cn &#xff0c;在个人中心->访…

【学习iOS高质量开发】——对象、消息、运行期

文章目录 一、理解“属性”这一概念1.如何定义实例变量2.什么是不兼容现象&#xff0c;如何解决3.理解property关键字4.理解dynamic关键字5.属性特质1.原子性&#xff1a;2.读/写权限&#xff1a;3.内存管理语义 7.要点 二、在对象内部尽量直接访问实例变量1.直接访问和属性访问…