ARM bootloader程序的理解
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ì)討論。
評(píng)論