欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > STM32从上电开始启动过程详解(上电->分散加载->main函数)

STM32从上电开始启动过程详解(上电->分散加载->main函数)

2025/2/24 17:11:02 来源:https://blog.csdn.net/hanchaoman/article/details/143775793  浏览:    关键词:STM32从上电开始启动过程详解(上电->分散加载->main函数)

1.硬件复位之后,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 程序。

2.从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函数

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词