Stm32的启动文件执行

我们都熟悉单片机上电后执行启动文件的汇编代码,初始化栈顶指针,初始化PC到reset_handler.

很疑惑,我们用的启动文件,怎么在机器上电的时候被执行的,是烧录的时候,启动文件的汇编代码被固化到哪了吗?求指导。

1.汇编文件被编译link到bin文件中了。先看下工程设置里Link页,

img


ro_base是0x8000000
再看下编译的s文件,定义的RESET 段,

img

该reset段是map文件中可以找到,如下:

img


通过对编译代码添加测试代码,如下图

img


编译生成hex文件后,使用jfalsh打开,发现如下:

img


即可证明.s文件被连接到hex的开始位置,也就是0x8000000开始的地址处。当然如果sct文件中指定了位置,s文件的位置将会受sct文件影响。

通过上述可知,Reset_Handler的地址就是存放复位向量的。当芯片复位后,会进到复位中断处理函数处执行,即如下代码:

img

依次执行SystemInit函数及__main函数,注意这里的__main不是我们定义的main,而是C库函数,主要是用来初始化系统堆栈,并跳到我们定义的main处理运行。
更为详细的启动文件分析可以看下这篇文章:
https://blog.csdn.net/chenbee168/article/details/128246677

那段代码对应的机器代码,肯定是在定义的代码空间的开始位置