完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
从*.s文件看程序启动过程
如果没记错的话,C语言中我们看代码一定都是从main()看起吧?因为“main()函数是程序的入口”,大家都这么说。但实际上如果我们从硬件上电复位看起,它并不是直接来到main()的——对于stm32单片机来说它至少还要把工程文件中对应的.s文件的汇编代码跑完才跳转到我们的用户程序。 参考资料 这几个链接的文章基本讲得差不多了。 *.s文件干了什么 以startup_stm32f10x_hd.s为例,可以看到单片机从复位(Reset引脚拉低、或重新上电)到进入用户main()函数之前执行了以下操作:
Cortex M3核和STM32单片机启动顺序的关系 Coter M3 CPU希望从0x00000000获取复位向量(Reset_Handler地址),但STM32使用一种特殊机制,使得CPU从0x00000000获取的是栈顶指针,然后从0x00000004获得真正的复位向量(Reset_Handler地址)。但是呢,这个0x00000000和0x00000004并不是真正的地址,它们真正指向的地址由BOOT0、BOOT1引脚配置来指定(给出地址和实际地址之间的转换称为“映射”、给出地址此时称为“别名”)(如下图,截自中文版F10x参考手册和参考博客):
看到这里可能有一个问题: 这个“别名”默认就是指向外面的其他地址吗?会不会一不小心真的把这个地址当做真实地址来用了? 比如:0x00000000会不会在某种情况下既不映射到0x20000000也不映射到0x08000000,而是真的就是0x00000000? 这个问题的答案可以在数据手册的《存储器映像》一章里找到: 从下图可以看到——整个存储器的0x00000000-(0x08000000-1)范围被划为Aliased to Flash or system memory depending on BOOT pins,说明这一块本来就一定会映射到外面其他区域,并不会被错误使用为实际地址。所以不用担心会有数据错误地存放到0x00000000这样的范围里面。 |
||
|
||
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1103 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1127 浏览 1 评论
556 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
420 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1009 浏览 2 评论
1601浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
267浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
282浏览 3评论
254浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
244浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-18 08:18 , Processed in 0.667579 second(s), Total 48, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号