打印
[其它应用]

关于MCU启动原理的几个关键问题

[复制链接]
1440|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 豌豆爹 于 2023-12-7 10:20 编辑

MCU最开始一启动后去哪里读代码?

CPU上电启动后被设计为去地址0x00000000位置处读取代码;
首先会连续读取两个字,分别是栈指针初始值和复位异常处理函数的地址;
然后跳去执行复位异常处理函数。


当然在一些早期的ARM处理器设计中,如Arm7TDMI,复位后会直接读取0地址处的代码进行执行,由软件初始化栈指针,0地址处存放的直接就是中断处理函数,而不是函数地址。

所以我们可以有理由推测出,第一个字是栈地址是因为接下来的复位中断处理函数涉及函数跳转,可能已经需要存放内容在栈里了。

0x0地址处是bootROM代码吗,还是用户bootloader代码?
答案是都可以。这其实取决于用户的代码是存放在哪里的。
比如说对于一些性能强的MCU(如Cortex-A系列)来说,代码本身体积比较大,存放在SD卡里或者QSPI/SPI Flash里都有可能,这些MCU启动一定是先去bootROM执行代码。
因为SD卡、SPI Flash的储存不在MCU的统一编址空间里,没初始化这些外设前根本无法访问,bootROM这块Nor Flash就一定是可以被MCU直接通过总线地址访问的,0地址的代码位于bootROM中。
代码从bootROM中起来后,通过启动引脚判断从哪个外设中搬用户程序,并去初始化相应外设,将外设中存储的用户代码搬到内部SRAM中执行。后续的启动流程不赘述。

对于一些小容量的MCU来说,比如Cortex-M3/M4,他们的芯片里有内置Flash,这个Flash的特点跟上面说的bootROM很像,是MCU可以直接通过地址总线去访问到的,不需要进行外设初始化的。
当然,这些MCU内部也是有bootROM的,因此这些MCU一上电可以选择从bootROM中启动,也可以选择从内置Flash中启动,是通过外部引脚进行选择的,选择了谁,就把谁的起始地址映射到0地址处。

类似Cortex-M3/M4是如何保证Flash起始地址是栈指针和复位异常处理函数指针的?
这一点实际是通过编译的链接文件制定的。比如说如下是我截取的IAR的链接文件.icf。

MCU有可能不从0地址开始读代码吗?
M7内核芯片比较灵活了,改变了固定从0x0000 0000地址读取中断向量表的问题。
以STM32H7为例,可以从 0x0000 0000 到 0x3FFF 0000 所有地址进行启动。专门安排了个选项字节来配置。感兴趣的话,可以查阅手册。
文章来源于网络,版权归原作者所有,如有侵权,请联系删除。

使用特权

评论回复
沙发
tpgf| | 2024-1-15 10:49 | 只看该作者
一般是不是直接读取启动代码去了啊

使用特权

评论回复
板凳
八层楼| | 2024-1-15 11:57 | 只看该作者
用户代码存在哪里可以由用户来确定吗

使用特权

评论回复
地板
guanjiaer| | 2024-1-15 18:14 | 只看该作者
如果我们不指定位置的话 默认从哪个地址开始存储呢

使用特权

评论回复
5
观海| | 2024-1-15 19:00 | 只看该作者
mcu一般不会从地址0读取代码吧

使用特权

评论回复
6
晓伍| | 2024-1-15 20:33 | 只看该作者
不同型号单片机的启动代码存储的起始位置是一样的吗

使用特权

评论回复
7
磨砂| | 2024-1-15 21:11 | 只看该作者
会不会不同厂家的单片机的地址不一样呢

使用特权

评论回复
8
AdaMaYun| | 2024-1-27 22:11 | 只看该作者
CPU上电启动后被设计为去地址0x00000000位置处读取代码

使用特权

评论回复
9
中国龙芯CDX| | 2024-1-27 22:20 | 只看该作者
M7内核芯片比较灵活了,改变了固定从0x0000 0000地址读取中断向量表的问题。

使用特权

评论回复
10
jf101| | 2024-1-27 22:35 | 只看该作者
boot'启动有哪些注意事项?

使用特权

评论回复
11
小小蚂蚁举千斤| | 2024-1-27 23:11 | 只看该作者
CPU上电启动后被设计为去地址0x00000000位置处读取代码

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

513

主题

1960

帖子

5

粉丝