|
大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是IAR啟動函數(shù)流程及其__low_level_init設(shè)計對函數(shù)重定向的影響。5 S. D, T8 |, m, j! L
上一篇文章 《IAR下RT-Thread工程自定義函數(shù)段重定向失效分析》 里我們找出了影響 IAR 鏈接器處理自定義程序段重定向的原因,主要跟 __low_level_init() 函數(shù)有關(guān),這個函數(shù)屬于 IAR 底層設(shè)計,它在 IAR 啟動函數(shù) __iar_program_start() 中會被自動調(diào)用。" h0 C8 Y; c J) h U# N; h: B
__iar_program_start() 是 IAR 標(biāo)準(zhǔn)啟動函數(shù),也屬于 IDE 底層設(shè)計。在任何一個 Cortex-M 廠商芯片的啟動文件里(startup_xxDevice.s)都能看到它的身影,它是復(fù)位函數(shù) Reset_Handler() 和 主函數(shù) main() 之間的橋梁,今天我們就仔細(xì)說說這個啟動函數(shù)以及其中 __low_level_init 設(shè)計:
* U1 F6 T0 u% B* Q8 q% G; s6 tNote 1:閱讀本文前需要對 《IAR鏈接文件(.icf)》、《IAR映射文件(.map)》 這兩種文件有所了解。Note 2:本文使用的 IAR EWARM 軟件版本是 v9.10.2。一、通用芯片上電啟動流程在深入挖掘 IAR 啟動函數(shù)源代碼之前,有必要先整體了解一下通用的芯片上電啟動流程,即進入用戶 main 函數(shù)之前內(nèi)核必須要做的事情,注意這里并不包含芯片底層外設(shè)的初始化(這是因芯片而異的)。9 |# y" \1 ]8 g
通用啟動流程簡單來說分為如下四步:第一步是從 ROM 區(qū)域中斷向量表里獲取入口函數(shù)開始執(zhí)行,設(shè)置好初始棧指針,有了正確的棧,內(nèi)核就具備函數(shù)跳轉(zhuǎn)執(zhí)行的能力了。第二步和第三步是全局變量的初始化(將全局變量初值從 ROM 區(qū)域拷貝到變量所鏈接的 RAM 區(qū)域),全局變量初始化完成,應(yīng)用程序就有了正確的初始態(tài),最后一步就是跳轉(zhuǎn)到 main 函數(shù)。 |
|