拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

启动与链接

启动与链接

启动流程:从向量表的第一项到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函数

返回列表