STM32从上电开始启动过程详解(上电->分散加载->main函数)
创作时间:
作者:
@小白创作中心
STM32从上电开始启动过程详解(上电->分散加载->main函数)
引用
CSDN
1.
https://blog.csdn.net/hanchaoman/article/details/143775793
硬件复位之后,CPU 内的时序逻辑电路首先完成如下两个工作(以程序代码下载到内部 flash 为例,flash首地址 0x0800 0000):
- 将 0x08000000 位置存放的堆栈栈顶地址存放到 SP 中(MSP)。
- 将 0x08000004 位置存放的向量地址装入 PC 程序计数器。
CPU 从 PC 寄存器指向的物理地址取出第 1 条指令开始执行程序,也就是开始执行复位中断服务程序 Reset_Handler。复位中断服务程序会调用 SystemInit() 函数来配置系统时钟、配置 FMC 总线上的外部 SRAM/SDRAM,然后跳转到 C 库中的 __main 函数。由 C 库中的 __main 函数完成用户程序的初始化工作(比如:变量赋初值等),最后由 __main 函数 -> __rt_entry -> main() 函数开始执行 C 程序。
从 flash 分散加载程序到 RAM
- 左边加载视图即静态的 Code 和 Data 放置方式,比如 download 的时候,两者把 axf 解析成 bin 文件,然后烧录到 nor flash 中,可以看到其实静态放置的位置关系不是很大,主要是执行的时候位置正确就行,因为 Code 中有绝对地址,不然 PC 跑飞。
- 执行视图即程序正常运行的时候 Code 或者 Data 放置的位置。
- 烧录的位置和程序执行的位置不同,分散加载负责讲其加载到对应位置,保证 main 函数执行正常。
- 图中BSS 段为初始化为 0 或者未初始化的全局变量,不占用 Image Size(bin 文件大小),所以加载视图中并没有其,执行视图必须有,上电的时候会将这部分初始化为 0。
分散加载危机 axf 示例:
综述函数的作用
来看看具体的分散加载代码,是如何搬运 data 和初始化 bss 段的。(下文中中断向量表偏移 0x10000 偏移 64K)
armcc 手册里面介绍:__main 和 __rt_entry 是初始化运行态的环境,以及后面运行 APP 程序。通俗点来讲 __main 函数初始化运行态的环境,主要的功能就是做分散加载将 Code 位置搬运正确,才能正常运行 Code。其作用如下:
- 将 section 拷贝到对应的执行域地址执行,(把 RO RW 从加载域拷贝到执行域,如果有压缩的 Section 会进行解压缩并进行拷贝)
- 还有 bss 段的初始化,将其初始化为 0,
- 之后跳到 __rt_entry。
- 以及堆栈的初始化,
- lib 库的初始化
- 跳到对应的用户程序(main)。
- main 函数结束后,调用 exit 函数。
手册内容如下:
- __user_setup_stackheap:初始化堆栈地址,以及 SP 指针位置
- __scatterload_copy:主要是 RW data 的拷贝
- __scatterload_zeroinit:主要是 ZI data 的初始化
__rt_entry 如下图 armcc 手册所说:
- 建立堆栈
- 初始化 C 库(方便固件使用 C 库)
- 调用 main 函数
- 关闭 C 库
- 离开
总结
上电 -> cpu 执行第一条用户代码的流程 -> 跳转到 Reset_Handler -> 调用 __main 函数 -> __rt_entry 函数 -> main 函数
热门推荐
Maya 2018玻璃材质制作教程
减肥期间怎么搭配饮食
中国动力电池产业发展历程与未来趋势分析
国画技法:写意茶花的画法与创作步骤!
电阻都有哪些封装,哪些是比较常用的?
狮子座的性格特点到底是怎样的?狮子座的人性格好吗?
星际战甲战争使获取攻略:多种方式助你轻松收集零件
胃已经"饱"了,却还是忍不住想吃,容易饿到底是不是病?
“天宫”建成两年交出丰硕“成绩单”,取得多项国际首次成果
中国太空加油技术取得重大突破:北斗卫星获8年续命
从选购到冲泡:全面了解决明子茶的泡制方法与注意事项
构建客户满意之基:高效投诉处理与前瞻预防策略
进化中的海尔,从"人单合一"到"链群合约"
《哪吒2 》:挣脱定义束缚,做平行宇宙的反骨魔童
动画初学者必读:20个最佳动画制作技巧
都市白领必修课:3个动作让眼压速降的奥秘
告别传统养老束缚!这七种新型养老方式正流行,每一种都超赞
如何用Markdown编写高效的文档?【附详细教程】
【AI中数学-概率论】贝叶斯分析:后验的智慧
每一个美食都有一个动人的故事,总有一个能打动你!你知道几个?
崇礼区各级共青团少先队组织开展“学雷锋”志愿服务活动
豆腐新视角:从日本豆腐大师看传统食材的现代复兴
“人工智能+智慧制造”之创新案例篇
今天是中国航天日,一起回顾中国航天的高光时刻
泰迪犬训练教学(培养听从、干净和社交能力的泰迪犬训练法)
如何找回被删除的微信好友,维护珍贵的人际关系方法解析
三阶魔方公式层叠法详解
API接口集成是什么以及API接口集成有哪些常见的挑战
周末不开门、预约找熟人……大学里的博物馆如何敞开大门?
大豆油的执行标准是什么 大豆油的等级划分及选购