單片機(jī)的快速啟動(dòng)技術(shù)
系統(tǒng)上電或復(fù)位后,程序從位于地址0x0的Reset Exception Vector處開(kāi)始執(zhí)行,因此需要在這里放置Bootloader的第一條指令:b ResetHandler,跳轉(zhuǎn)到標(biāo)號(hào)為ResetHandler處進(jìn)行第一階段的硬件初始化,主要內(nèi)容為:關(guān)看門狗定時(shí)器,關(guān)中斷,初始化PLL和時(shí)鐘,初始化存儲(chǔ)器系統(tǒng)。執(zhí)行完以上程序后,系統(tǒng)進(jìn)行堆棧和存儲(chǔ)器的初始化。系統(tǒng)堆棧初始化取決于用戶使用了哪些中斷,以及系統(tǒng)需要處理哪些錯(cuò)誤類型。一般情況下,管理者堆棧必須設(shè)置,如果使用了IRQ中斷,則IRQ堆棧也必須設(shè)置。如果系統(tǒng)使用了外設(shè),則需要設(shè)置相關(guān)的寄存器,以確定其刷新頻率、總線寬度等信息。
代碼段復(fù)制到RAM中運(yùn)行
因?yàn)榍度胧较到y(tǒng)的代碼通常都是固化在ROM或者Flash中,上電后開(kāi)始運(yùn)行。由于ROM和Flash的讀取速度相對(duì)較慢,這樣無(wú)疑會(huì)降低代碼的執(zhí)行速度和系統(tǒng)的運(yùn)行效率。為此,需要把系統(tǒng)的代碼復(fù)制到RAM中運(yùn)行。使用SDT鏈接器ARMLink產(chǎn)生的定位信息,把RO的有效代碼和數(shù)據(jù)段到RAM中。 ARMLink將編譯后的程序鏈接成ELF文件。映像文件內(nèi)部共有三種輸出段:RO段、RW段和ZI段。這三種輸出段分別包含了只讀代碼及包含在代碼段中的少量數(shù)據(jù)、可讀寫(xiě)的數(shù)據(jù)、初始化為0的數(shù)據(jù),ARMLink同時(shí)還產(chǎn)生了這三種輸出段的起始和終止定位信息:Image$$RO$$Base、 Image$$RO$$Limit、Image$$RW$$Base、Image$$Limit、Image$$Linit和Image$$ZI$$ Limit??梢栽诔绦蛑惺褂眠@些定位信息。將ROM中的代碼和數(shù)據(jù)搬移到RAM中,具體程序如下。
LDR r0, =|Image$$RO$$Base| /*RO段起始地址*/
LDR r1, =|Image$$RO$$Limit| /*RO段結(jié)束地址*/
LDR r2, =|Image$$RW$$Base|
LDR r3, =|Image$$RW$$Limit|
/*分別求出需要映像的代碼和數(shù)據(jù)的長(zhǎng)度并累加,放到寄存器R1中*/
SUB r1, r1, r0
SUB r3, r3, r2
ADD r1, r1, r3
/*將需要映象的代碼和數(shù)據(jù)復(fù)制到RAM中去*/
0 /*標(biāo)示符*/
LDR r3, [r0], #4
STR r3, [r2], #4
SUBS r1, r1, #4
BNE %B0 /*如果沒(méi)有復(fù)制完,跳轉(zhuǎn)到0標(biāo)示符處的匯編語(yǔ)句,繼續(xù)復(fù)制,參見(jiàn)ARM指令幫助手冊(cè)*/
建立二級(jí)中斷向量表
在ARM 系統(tǒng)中,中斷向量表位于0X0開(kāi)始的地址處,意味著無(wú)論運(yùn)行什么樣的上層軟件,一旦發(fā)生中斷,程序就得到Flash存儲(chǔ)器中的中斷向量表里去,降低系統(tǒng)的運(yùn)行效率。因此在RAM中建立自己的二級(jí)中斷向量表,當(dāng)中斷發(fā)生后,程序直接從RAM中取中斷向量進(jìn)入中斷子程序。尤其是在中斷頻繁發(fā)生的系統(tǒng)里,這種方法可以大大提高系統(tǒng)的運(yùn)行效率,具體的實(shí)現(xiàn)代碼如下。
評(píng)論