MCU内存详解

MCU的内存主要有两类:

  • flash/ROM:只读、掉电数据不丢失,用于存储程序代码、常量、已初始化全局变量的初始值

  • RAM:可读写、掉电数据丢失,用于存储运行时的全局变量、局部变量、堆 / 栈等

这种地址映射是芯片厂商在设计时通过硬件电路(如内存控制器)固定的,软件无法修改。

C代码从编译到运行,需要经过三步:编译→汇编→链接,而其中链接器是"地址分配者",实际是依据链接脚本。

  • 编译→汇编:将高级语言→底层指令,同时包含中间代码生成与优化,最终生成目标架构的汇编指令,汇编器将汇编代码翻译成ELF格式的可冲定位目标文件(这个时候仅有段内偏移,未绑定最终物理地址)

  • 汇编→链接:本质是:"整合多文件、分配最终地址、修正符号引用 ",链接器处理输入的多个.o文件(及可能的库文件lib.a),最终输出 .elf/.bin

    • .text段(代码 + 只读数据)分配到FLASH区域

    • .data段(已初始化非const全局变量):RAM(可读写)

    • .bss段(未初始化的全局变量,初始值为0的全局变量,未初始化的静态变量):分配到RAM

    • .rodata段:const修饰的全局变量,存于ROM/FLASH


正是由于ELF有一个符号表(.symtab)去记录全局符号的最终物理地址,我们就可以通过objdump这个工具去找到某个全局变量的内存地址,如果是一个结构体,我们也可以先找到结构体的基地址,然后找到对应成员的偏移,就可以找到成员地址。这个实现的前提是芯片并没有虚拟内存,否则是无法实现的,下篇应该会说说MCU上电后的执行过程

https://mp.weixin.qq.com/s/3DLWcD1sqd_mwK_Pjo3jFwhttps://mp.weixin.qq.com/s/3DLWcD1sqd_mwK_Pjo3jFw

相关推荐
北京耐用通信12 小时前
告别“蜘蛛网”接线!耐达讯自动化PROFIBUS 三路集线器让气缸布线“一拖三”的神操作
人工智能·物联网·网络协议·自动化·信息与通信
oura19 小时前
log2查找表的核心设计思路
信息与通信·信号处理
Hi, how are you1 天前
GyAn数字资产守护系统
python·安全·http·网络安全·信息与通信
奋进的电子工程师2 天前
AI与网络测试的结合,会碰撞出怎样的火花?
人工智能·信息与通信
北京耐用通信2 天前
预算减半,效率翻倍:耐达讯自动化Profibus六路中继器如何成为工程师的“省钱利器”
人工智能·物联网·网络协议·自动化·信息与通信
北京耐用通信2 天前
告别布线烦恼:耐达讯自动化Profibus六路中继器如何让您的网络“无限续航”
人工智能·物联网·网络协议·自动化·信息与通信
小龙报3 天前
【初阶数据结构】从 “数组升级” 到工程实现:动态顺序表实现框架的硬核拆解指南
c语言·数据结构·c++·算法·机器学习·信息与通信·visual studio
小龙报4 天前
【算法通关指南:算法基础篇 】双指针专题:1.唯一的雪花 2.逛画展 3.字符串 4.丢手绢
c语言·数据结构·c++·人工智能·深度学习·算法·信息与通信
chen_ever4 天前
Protobuf详解(从安装到实战)
c++·rpc·信息与通信
Wnq100725 天前
新型基于“去中心化分布式Agent“技术的操作系统DIOS
分布式·嵌入式硬件·中间件·架构·云计算·去中心化·信息与通信