|
大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是IAR啟動函數流程及其__low_level_init設計對函數重定向的影響。
; Z p# p) `1 _上一篇文章 《IAR下RT-Thread工程自定義函數段重定向失效分析》 里我們找出了影響 IAR 鏈接器處理自定義程序段重定向的原因,主要跟 __low_level_init() 函數有關,這個函數屬于 IAR 底層設計,它在 IAR 啟動函數 __iar_program_start() 中會被自動調用。
! J% x, [7 R8 o; h/ u7 E__iar_program_start() 是 IAR 標準啟動函數,也屬于 IDE 底層設計。在任何一個 Cortex-M 廠商芯片的啟動文件里(startup_xxDevice.s)都能看到它的身影,它是復位函數 Reset_Handler() 和 主函數 main() 之間的橋梁,今天我們就仔細說說這個啟動函數以及其中 __low_level_init 設計:2 l# k) W& `# c8 l, L
Note 1:閱讀本文前需要對 《IAR鏈接文件(.icf)》、《IAR映射文件(.map)》 這兩種文件有所了解。Note 2:本文使用的 IAR EWARM 軟件版本是 v9.10.2。一、通用芯片上電啟動流程在深入挖掘 IAR 啟動函數源代碼之前,有必要先整體了解一下通用的芯片上電啟動流程,即進入用戶 main 函數之前內核必須要做的事情,注意這里并不包含芯片底層外設的初始化(這是因芯片而異的)。
_$ s4 o9 m+ e: L通用啟動流程簡單來說分為如下四步:第一步是從 ROM 區(qū)域中斷向量表里獲取入口函數開始執(zhí)行,設置好初始棧指針,有了正確的棧,內核就具備函數跳轉執(zhí)行的能力了。第二步和第三步是全局變量的初始化(將全局變量初值從 ROM 區(qū)域拷貝到變量所鏈接的 RAM 區(qū)域),全局變量初始化完成,應用程序就有了正確的初始態(tài),最后一步就是跳轉到 main 函數。 |
|