reset_handler: LDR R0, =_estack ; 初始化堆栈指针 MOV SP, R0 LDR R0,...
__iar_program_start() 是 IAR 标准启动函数,也属于 IDE 底层设计。在任何一个 Cortex-M 厂商芯片的启动文件里(startup_xxDevice.s)都能看到它的身影,它是复位函数 Reset_Handler() 和 主函数 main() 之间的桥梁,今天我们就仔细说说这个启动函数以及其中 __low_level_init 设计: Note 1:阅读本文前需要对...
__iar_program_start 是 IAR 标准启动函数,也属于 IDE 底层设计。在任何一个 Cortex-M 厂商芯片的启动文件里(startup_xxDevice.s)都能看到它的身影,它是复位函数 Reset_Handler 和 主函数 main 之间的桥梁,今天我们就仔细说说这个启动函数以及其中 __low_level_init 设计: Note 1:阅读本文前需要对 《IAR链接...
然后我们在启动文件复位函数 Reset_Handler 中调用 __iar_program_start 之前增加一个 init_data_bss() 函数调用: Reset_Handler CPSID I LDR R0, =0xE000ED08 LDR R1, =__vector_table STR R1, [R0] LDR R2, [R1] MSR MSP, R2 LDR R0, =SystemInit BLX R0 LDR R0, =init_data_bss ; 新增初始...
PUBWEAK Reset_Handler SECTION .text:CODE:REORDER(2) Reset_Handler LDR R0, =SystemInit BLX R0 LDR R0, =__iar_program_start BX R0 看来ST没有做太多的事,他只调用了自家库提供的SystemInit函数进行系统时钟、Flash读取的初始化,并把大权交给了__iar_program_start这个IAR提供的“内部函数”了,我们就跟...
然后我们在启动文件复位函数 Reset_Handler 中调用 __iar_program_start 之前增加一个 init_data_bss() 函数调用: Reset_Handler CPSID I LDR R0, =0xE000ED08 LDR R1, =__vector_table STR R1, [R0] LDR R2, [R1] MSR MSP, R2 LDR R0, =SystemInit ...
然后我们在启动文件复位函数 Reset_Handler 中调用 main 之前增加一个 init_data_bss() 函数调用: Reset_Handler CPSID I LDR R0, =0xE000ED08 LDR R1, =__vector_table STR R1, [R0] LDR R2, [R1] MSR MSP, R2 LDR R0, =SystemInit BLX R0 ...
这要从工程启动文件 startup_MIMXRT1062.s 谈起。在复位函数 Reset_Handler 的最后调用了 IAR 内置函数 __iar_program_start,这个函数中隐藏着玄机,我们可以在 \IAR Systems\Embedded Workbench 8.50.6\arm\src\lib\thumb\cstartup_M.c 文件中找到该函数原型,顺着原型你应该可以发现其中的奥秘。
上一个测试结果在 i.MXRT 下并不能正常工作,除了没有将 .boot_hdr.xxx 启动头全部放在 Flash 指定偏移处之外(两个没加 readonly 修饰的侥幸放对了),ARM 中断向量表也没有放在指定位置,会影响复位函数 Reset_Handler 的正常执行,因此在 i.MXRT 上我们至少应该将如下段放进 except 列表里: ...
复位之后,PC会停在复位向量Reset_Handler,Reset_Handler首先会调用SystemInit函数进行相关的配置和初始化(这个是Cortex-M CMSIS的标准),然后会调用__iar_program_start: 如果对应的MCU有FPU,__iar_program_start首先会调用__iar_init_vfp对FPU进行初始化: ...