STM32从上电开始启动过程详解(上电->分散加载->main函数)
创作时间:
作者:
@小白创作中心
STM32从上电开始启动过程详解(上电->分散加载->main函数)
引用
CSDN
1.
https://blog.csdn.net/hanchaoman/article/details/143775793
本文详细解析了STM32微控制器从硬件复位到main函数执行的整个启动过程,包括堆栈初始化、中断向量表加载、分散加载等关键步骤。对于从事嵌入式开发的工程师来说,这是一篇很好的参考资料。
- 硬件复位之后,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"或者"未初始化的全局变量",不占用ImageSize(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函数
热门推荐
健身教练薪资福利全解析:从底薪到职业发展
已瘦30斤低卡拌饭合集!吃得干净真的会瘦!!
了不起的毕业论文01|重现同济实验楼,一份论文聆听师生两代“器官移植”心路
卤猪头肉的做法和配方,操作简单,一遍就会
家人往生念经:轻松了解如何超度心中牵挂的亲人
南方周末:昆明——没有夏天的城市,没有安放生活的阻力
探究反社会人格犯罪者的犯罪心理与行为特征
美式九球比赛规则详解
唐代“药王”孙思邈:悬壶济世,医道双修
从红色遗址到文化产业园:淄博“四十亩地”的百年变迁
为什么人工智能的发展趋势对社会结构有深远影响?
道教宝诰:修道养生的智慧结晶
超慢跑对身体有什么好处
学习时报谈《黑神话:悟空》:中华传统文化的世界表达
车辆发生事故的保险定损与理赔
日抛隐形眼镜是否对眼睛有伤害?专家权威解答
MBTI的INFP人格全面解析:INFP人格成长指南
水资源税即将全面实施,覆盖31个省份!对水价有何影响?专家解读
朱厚熜与嘉靖新政:一位能力显著的皇帝与他的治理成就
揭秘种植牙全部费用包括哪些:术前检查|一期二期三期治疗费用一网打尽,快来算算!
明军兵临大都城下,元军做了哪些抵抗?徐达为什么要放走元顺帝?
参军入伍:我国男生应具备的身体素质与基本条件
原神4.2版本芙宁娜攻略:机制详解与使用指南
探究北宋时期服饰的风格与特点
北宋版图的最大扩展:历史与地理的交汇
2025年正月中国影市总票房达204.44亿 创下单月(农历)票房和人次新高
离职后公司继续缴纳社保,这个费用谁承担
双灵:北美洲土著文化中的性别多样性
山楂六物是哪六物
探秘3开头股票:解锁创业板买入条件的全面解析