新聞中心

ARM bootloader程序的理解

作者: 時(shí)間:2016-11-10 來源:網(wǎng)絡(luò) 收藏
作為一個(gè)嵌入式工程師,如果不能寫bootloader程序,那就不能成為一個(gè)真正的嵌入式工程師.以前做linux driver,常對(duì)bootloader程序是一知半解,其實(shí)要寫好bootloader程序還得好好去研讀一下處理器 architecture.

ARM 處理器是一種很熱門的嵌入式處理器,現(xiàn)在絕大部分的嵌入式產(chǎn)品都用到了ARM處理器,其低廉的價(jià)格和豐富的性能都受到的消費(fèi)者的青睞.下面針對(duì)ARM處理器來具體談一下ARM bootloader程序.

本文引用地址:http://m.butianyuan.cn/article/201611/317085.htm

首先簡(jiǎn)單的了解一下ARM architecture.ARM主要由ARM內(nèi)核單元,vector interface ,coprocessor,兩種cache(instruction and data),兩種TCM(instruction and data), MMU, power management等. cache是為了平衡數(shù)據(jù)之間的速度而使用的,而TCM是為了存儲(chǔ)一些頻繁使用的數(shù)據(jù),如中斷向量等,MMU主要處理虛擬地址到物理地址的轉(zhuǎn)換,起到了對(duì)數(shù)據(jù)的保護(hù)作用,用在操作系統(tǒng)的體系中,很顯然,bootloader程序就是要為后來的程序提供一個(gè)良好的運(yùn)行環(huán)境,這里對(duì)ARM architecture的幾個(gè)組成單元進(jìn)行必要的配置.

綜上所述,ARM bootloader程序主要完成下面幾個(gè)功能:

1)初始化棧.

2)中斷向量表的復(fù)制.

3)TCM 和cache的配置,如果有操作系統(tǒng)的話,就應(yīng)該設(shè)置MMU.

4)建立一個(gè)程序執(zhí)行文境.(具體一點(diǎn),就是根據(jù)image文件的屬性來處理image段的數(shù)據(jù)).

5)對(duì)內(nèi)存如mddr,sram進(jìn)行簡(jiǎn)單的測(cè)試.

6)需要設(shè)置一些外圍設(shè)備,一般來說需要配置一下串口.

一、初始化棧:

應(yīng)該對(duì)irq,firq,svc的棧進(jìn)行指定,分別操作這幾中模式的寄存器。如對(duì)irq模式.

mov r0 , #0x12; irq mode

msrCPSR , r0; set irq mode

ldr sp, =0x800; irq steak address

二、中斷向量表的復(fù)制:

Boot_Def
ldrPC,Arm_Addr_Ini;0x00
ldrPC,Arm_Addr_Und;0x04
ldrPC,Arm_Addr_Swi;0x08
ldrPC,Arm_Addr_Pre;0x0C
ldrPC,Arm_Addr_Abt;0x10
nop;0x14
ldrPC,Arm_Addr_Irq;0x18
ldrPC,Arm_Addr_Fiq;0x1C

Arm_Addr_IniDCDbootstrap_entry + 0x00;0x20
Arm_Addr_UndDCDundefined_exception_handler;0x24
Arm_Addr_SwiDCDsoftware_interrupt_handler;0x28
Arm_Addr_PreDCDprefetch_exception_handler;0x2C
Arm_Addr_AbtDCDabort_exception_handler;0x30
Arm_Addr_IrqDCDirq_interrupt_handler;0x34
Arm_Addr_FiqDCDfiq_interrupt_handler;0x38

DCD0x12345678; 0x3c

...

ldrr0,=Boot_Def
ldrr1, =0x0;address 0x0
mov r2,#0x3C
add r2, r2, r1

0
cmpr1, r2
bge%b1
ldrcc r3,[r0],#4
strcc r3,[r1],#4
b%B0
1

三、TCM的配置

TCM和cache是有區(qū)別的,雖然都是為了加快速度,但是TCM必須給它指定地址,TCM和cache的用途也不樣,TCM保存常用到的數(shù)據(jù)如中斷向量表和realtime數(shù)據(jù),而cache只是為了加快處理器和外設(shè)之間的數(shù)據(jù)處理。


ldr r0,=0x0;
mrc p15, 0, r1, c9, c1, 1;讀coprocessor instruction tcmregion register.
orr r0, r0, r1;
movr1, #1
orr r1, r1, r0;instruction tcm bit_o 置1,enableinsturction tcm.
mcrp15,0,r1,c9,c1,1;寫入

其它的cache配置也類似,主要讀懂ARM document.

四、建立一個(gè)程序運(yùn)行文境:

image(bin文件)包括倆部分:RO and RW,RO部分一般我們?cè)诩虞d前后的位置都不用變化,但是RW必須在加載后把他放到RAM中執(zhí)行,所以RW部分我們把它映射到RAM地址中。

IMPORT|Image$$RO$$Base| ;imageRO開始地址
IMPORT|Image$$RO$$Limit|
IMPORT|Image$$RO$$Length|
IMPORT|Image$$RW$$Base|
IMPORT|Image$$RW$$Limit|
IMPORT|Image$$RW$$Length|
IMPORT|Image$$ZI$$Base|
IMPORT|Image$$ZI$$Limit|
IMPORT|Image$$ZI$$Length|

ldrr0,=|Image$$RO$$Limit|
ldrr1,=|Image$$RW$$Base|
ldrr2,=|Image$$RW$$Limit|

3
cmpr1,r2
bge%B3
ldrcc r3,[r0],#4;從RO段的結(jié)束地址+1load rw段數(shù)據(jù)
strccr3,[r1],#4;重新寫入到rw段
b%B4
4

ldrr0,=|Image$$ZI$$Base|;處理ZI段數(shù)據(jù)
ldrr1,=|Image$$ZI$$Length|
add r1, r1, r0
ldr r1, =0X2000
ldrr2,=0
5
cmpr0, r1
bge%B6
strccr2,[r0],#4;初始化ZI段數(shù)據(jù)為0
b%B5
6

五、對(duì)內(nèi)存進(jìn)行測(cè)試:

由于系統(tǒng)中有各種各樣的內(nèi)存,可以對(duì)內(nèi)存進(jìn)行簡(jiǎn)單測(cè)試。

六、UART的配置:

UART在嵌入式系統(tǒng)中很重要,雖然它很簡(jiǎn)單,但是在早期開發(fā)中,UART是必須的設(shè)備之一。UART作為下一篇中將進(jìn)一步詳細(xì)討論。



關(guān)鍵詞: ARMbootloader程

評(píng)論


技術(shù)專區(qū)

關(guān)閉