- 设定栈指针
Reset_Handler:
ldr sp, =_estack /* set stack pointer */
- 程序中有定义一些赋初值的变量,在编译的时候,会规定好这些变量在ram中的地址,以及这些变量的初值存在flash中的哪里。有这些信息,就是为了将ram中编译器为这些变量预订好的地址的地方,填充好他们各自的初值。
/* Copy the data segment initializers from flash to SRAM */
movs r1, #0
b LoopCopyDataInit
CopyDataInit:
ldr r3, =_sidata
ldr r3, [r3, r1]
str r3, [r0, r1]
adds r1, r1, #4
LoopCopyDataInit:
ldr r0, =_sdata
ldr r3, =_edata
adds r2, r0, r1
cmp r2, r3
bcc CopyDataInit
- 这里是将那些没有赋初值的变量初始化成0。方式方法和前面类似。
ldr r2, =_sbss
b LoopFillZerobss
/* Zero fill the bss segment. */
FillZerobss:
movs r3, #0
str r3, [r2], #4
LoopFillZerobss:
ldr r3, = _ebss
cmp r2, r3
bcc FillZerobss
- 初始化一些系统配置,例如禁止中断等。
/* Call the clock system intitialization function.*/
bl SystemInit
- 将程序跳转到main的入口。
/* Call the application's entry point.*/
bl main