|
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是IAR启动函数流程及其__low_level_init设计对函数重定向的影响。& C" `. q7 {, } o* @# u
上一篇文章 《IAR下RT-Thread工程自定义函数段重定向失效分析》 里我们找出了影响 IAR 链接器处理自定义程序段重定向的原因,主要跟 __low_level_init() 函数有关,这个函数属于 IAR 底层设计,它在 IAR 启动函数 __iar_program_start() 中会被自动调用。
U5 s8 p* m4 b/ k; R2 ]* l2 }7 \__iar_program_start() 是 IAR 标准启动函数,也属于 IDE 底层设计。在任何一个 Cortex-M 厂商芯片的启动文件里(startup_xxDevice.s)都能看到它的身影,它是复位函数 Reset_Handler() 和 主函数 main() 之间的桥梁,今天我们就仔细说说这个启动函数以及其中 __low_level_init 设计:0 a4 Y- h: H5 [' m n0 D
Note 1:阅读本文前需要对 《IAR链接文件(.icf)》、《IAR映射文件(.map)》 这两种文件有所了解。Note 2:本文使用的 IAR EWARM 软件版本是 v9.10.2。一、通用芯片上电启动流程在深入挖掘 IAR 启动函数源代码之前,有必要先整体了解一下通用的芯片上电启动流程,即进入用户 main 函数之前内核必须要做的事情,注意这里并不包含芯片底层外设的初始化(这是因芯片而异的)。! [" n1 o4 K/ Y8 F: Z
通用启动流程简单来说分为如下四步:第一步是从 ROM 区域中断向量表里获取入口函数开始执行,设置好初始栈指针,有了正确的栈,内核就具备函数跳转执行的能力了。第二步和第三步是全局变量的初始化(将全局变量初值从 ROM 区域拷贝到变量所链接的 RAM 区域),全局变量初始化完成,应用程序就有了正确的初始态,最后一步就是跳转到 main 函数。 |
|