ARM移植之BootLoader(1)
BootLoader 的實(shí)現(xiàn)依賴于CPU的體系結(jié)構(gòu),因此大多數(shù) BootLoader 都分為stage1 和stage2 兩大部分。依賴于CPU體系結(jié)構(gòu)的代碼,比如設(shè)備初始化代碼等,通常都放在 stage1中,而且通常都用匯編語言來實(shí)現(xiàn),以達(dá)到短小精悍的目的。而stage2 則通常用C 語言來實(shí)現(xiàn),這樣可以實(shí)現(xiàn)更復(fù)雜的功能,而且代碼會(huì)具有更好的可讀性和可移植性。
BootLoader 的 stage1 通常包括以下步驟:
·硬件設(shè)備初始化;
·為加載Boot Loader的stage2準(zhǔn)備 RAM 空間;
·拷貝Boot Loader的stage2 到RAM空間中;
·設(shè)置好堆棧;
·跳轉(zhuǎn)到 stage2 的 C 入口點(diǎn)。
Boot Loader的stage2通常包括以下步驟:
·初始化本階段要使用到的硬件設(shè)備;
·檢測系統(tǒng)內(nèi)存映射(memory map);
·將kernel 映像和根文件系統(tǒng)映像從flash上讀到 RAM 空間中;
·為內(nèi)核設(shè)置啟動(dòng)參數(shù);
·調(diào)用內(nèi)核。
本系統(tǒng)中的BootLoader參照韓國mizi公司的vivi進(jìn)行修改。
1.開發(fā)環(huán)境
我們購買了武漢創(chuàng)維特信息技術(shù)有限公司開發(fā)的具有自主知識(shí)產(chǎn)權(quán)的應(yīng)用于嵌入式軟件開發(fā)的集成軟、硬件開發(fā)平臺(tái)ADT(ARM Development Tools)它為基于ARM 核的嵌入式應(yīng)用提供了一整套完備的開發(fā)方案,包括程序編輯、工程管理和設(shè)置、程序編譯、程序調(diào)試等。
ADT嵌入式開發(fā)環(huán)境由ADT Emulator for ARM 和ADT IDE for ARM組成。ADT Emulator for ARM 通過JTAG 實(shí)現(xiàn)主機(jī)和目標(biāo)機(jī)之間的調(diào)試支持功能。它無需目標(biāo)存儲(chǔ)器,不占用目標(biāo)系統(tǒng)的任何端口資源。目標(biāo)程序直接在目標(biāo)板上運(yùn)行,通過ARM 芯片的JTAG 邊界掃描口進(jìn)行調(diào)試,屬于完全非插入式調(diào)試,其仿真效果接近真實(shí)系統(tǒng)。
ADT IDE for ARM 為用戶提供高效明晰的圖形化嵌入式應(yīng)用軟件開發(fā)環(huán)境,包括一整套完備的面向嵌入式系統(tǒng)的開發(fā)和調(diào)試工具:源碼編輯器、工程管理器、工程編譯器(編譯器、匯 編器和連接器)、集成調(diào)試環(huán)境、ADT Emulator for ARM 調(diào)試接口等。其界面同Microsoft Visual Studio 環(huán)境相似,用戶可以在ADT IDE for ARM 集成開發(fā)環(huán)境中創(chuàng)建工程、打開工程,建立、打開和編輯文件,編譯、連接、設(shè)置、運(yùn)行、調(diào)試嵌入式應(yīng)用程序。
ADT嵌入式軟件開發(fā)環(huán)境 采用主機(jī)-目標(biāo)機(jī)交叉開發(fā)模型。ADT IDE for ARM 運(yùn)行于主機(jī)端,而ADT Emulator for ARM 實(shí)現(xiàn)ADT IDE for ARM 與目標(biāo)機(jī)之間的連接。開發(fā)時(shí),首先由ADT IDE for ARM 編譯連接生成目標(biāo)代碼,然后建立與ADT Emulator for ARM 之間的調(diào)試通道,調(diào)試通道建立成功后,就可以在ADT IDE for ARM 中通過ADT Emulator for ARM 控制目標(biāo)板實(shí)現(xiàn)目標(biāo)程序的調(diào)試,包括將目標(biāo)代碼下載到目標(biāo)機(jī)中,控制程序運(yùn)行,調(diào)試信息觀察等等。
2.ARM匯編
ARM本身屬于RISC指令系統(tǒng),指令條數(shù)就很少,而其編程又以C等高級(jí)語言為主,我們僅需要在Bootloader的第一階段用到少量匯編指令:
?。?)+-運(yùn)算
ADD r0, r1, r2 ―― r0 := r1 + r2 SUB r0, r1, r2 ―― r0 := r1 - r2 |
其中的第二個(gè)操作數(shù)可以是一個(gè)立即數(shù):
ADD r3, r3, #1 ―― r3 := r3 + 1 |
第二個(gè)操作數(shù)還可以是位移操作后的結(jié)果:
ADD r3, r2, r1, LSL #3 ―― r3 := r2 + 8.r1 |
?。?)位運(yùn)算
AND r0, r1, r2 ―― r0 := r1 and r2 ORR r0, r1, r2 ―― r0 := r1 or r2 EOR r0, r1, r2 ―― r0 := r1 xor r2 BIC r0, r1, r2 ―― r0 := r1 and not r2 |
?。?)寄存器搬移
MOV r0, r2 ―― r0 := r2 MVN r0, r2 ―― r0 := not r2 |
?。?)比較
CMP r1, r2 ―― set cc on r1 - r2 CMN r1, r2 ―― set cc on r1 + r2 TST r1, r2 ―― set cc on r1 and r2 TEQ r1, r2 ―― set cc on r1 or r2 |
這些指令影響CPSR寄存器中的 (N, Z, C, V) 位
(5)內(nèi)存操作
LDR r0, [r1] ―― r0 := mem [r1] STR r0, [r1] ―― mem [r1] := r0 LDR r0, [r1, #4] ―― r0 := mem [r1+4] LDR r0, [r1, #4] ! ―― r0 := mem [r1+4] r1 := r1 + 4 LDR r0, [r1], #4 ―― r0 := mem [r1] r1 := r1 +4 LDRB r0 , [r1] ―― r0 := mem8 [r1] LDMIA r1, {r0, r2, r5} ―― r0 := mem [r1] r2 := mem [r1+4] r5 := mem [r1+8] |
{..} 可以包括r0~r15中的所有寄存器,若包括r15 (PC)將導(dǎo)致程序的跳轉(zhuǎn)。
?。?)控制流
例1:
MOV r0, #0 ; initialize counter LOOP: ADD r0, r0, #1 ; increment counter CMP r0, #10 ; compare with limit BNE LOOP ; repeat if not equal |
例2:
CMP r0, #5 ADDNE r1, r1, r0 SUBNE r1, r1, r2 ―― if (r0 != 5) { r1 := r1 + r0 - r2 } |
評(píng)論