启动流程:从向量表的第一项到main,首先初始化MSP主栈指针,后进入Reset_Handler
g_pfnVectors:
.word _estack /* 初始主栈指针 (MSP) - 硬件自动加载 */
.word Reset_Handler /* 复位入口 - 硬件自动加载到 PC */
.word NMI_Handler
.word HardFault_Handler
.word MemManage_Handler
.word BusFault_Handler
.word UsageFault_Handler.......
流程如下图所示:
在链接脚本中将isr_vector放在第一个位置即0x08000000,硬件复位时的向量表地址。
SECTIONS
{
.isr_vector : ← 第一个段,物理位置 = Flash 起点
{
. = ALIGN(4);
KEEP (*(.isr_vector)) ← KEEP 防止 --gc-sections 删除
. = ALIGN(4);
} >FLASH ← 放进 FLASH (0x08000000)
.text : { ... } >FLASH ← 代码段在向量表之后
...
}
由上可得,初始化MSP主栈指针后,进入Reset_Handler,继续调用__start转入C语言代码。
Reset_Handler:
bl __start
.L_main_return:
bl .L_main_return
复制.data段数据到SRAM供程序读写
src = &_sidata; for(dest = &_sdata; dest < &edata;) { *dest++ = *src++; }清零.bss段,.bss段不占用FLASH
for(dest = &_sbss; dest < &_ebss) { *dest++ = 0; }时钟初始化
进入main函数