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 ; 新增初始...
Reset_Handler LDR R0, =SystemInit BLX R0 LDR R0, =__iar_program_start BX R0 看来ST没有做太多的事,他只调用了自家库提供的SystemInit函数进行系统时钟、Flash读取的初始化,并把大权交给了__iar_program_start这个IAR提供的“内部函数”了,我们就跟紧这个__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() 函数之前的全部动作。随便下载一家 Cortex-M 厂商芯片 SDK 包,找到 IAR 版启动文件,其复位函数流程都差不多,这是 Cortex-M 内核架构决定的。
我们知道复位函数 Reset_Handler() 是芯片上电启动执行的第一个函数(有时又叫入口函数),它完成了进入用户 main() 函数之前的全部动作。随便下载一家 Cortex-M 厂商芯片 SDK 包,找到 IAR 版启动文件,其复位函数流程都差不多,这是 Cortex-M 内核架构决定的。
这要从工程启动文件 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 列表里: ...