基于A(yíng)RM的嵌入式系統Bootloader啟動(dòng)流程分析
/*設置時(shí)鐘控制寄存器*/
ldrr0,=LOCKTIME
ldrr1,=0xfff
strr1,[r0]
.if PLLONSTART
ldrr0,=PLLCON/* 設置PLL */
ldrr1,=((M_DIV12)+(P_DIV4)+S_DIV)/*Fin=8MHz,Fout=64MHz*/
strr1,[r0]
.endif
ldr r0,=CLKCON
ldr r1,=0x7ff8 /*所有單元時(shí)鐘允許*/
str r1,[r0]
/*為BDMA設置復位值*/
ldr r0,=BDIDES0
ldr r1,=0x40000000 /* BDIDESn 復位值應為 0x40000000 */
str r1,[r0]
ldr r0,=BDIDES1
ldr r1,=0x40000000 /* BDIDESn 復位值應為 0x40000000 */
str r1,[r0]
/*設置存儲器控制寄存器,存儲器的配置數據都存儲在SMRDATA為起始地址的數據表中,下面的代碼可以一次將預先配置好的初始化數據存入與存儲器控制器相關(guān)的13個(gè)寄存器,這些寄存器則是以0x01c80000為起始地址的13個(gè)連續的32位寄存器*/
ldr r0,=SMRDATA
ldmia r0,{r1-r13}
ldr r0,=0x01c80000 /* BWSCON存儲控制寄存器地址 */
stmia r0,{r1-r13}
/*初始化堆棧*/
/* CPU復位后是處于管理模式下的,所以首先要初始化管理模式下的堆棧寄存器*/
ldr sp, =SVCStack
/*由于處理器的每種運行模式都要有自己獨立的物理堆棧寄存器R13,在用戶(hù)應用程序的初始化部分,一般都要初始化每種模式下的R13,使其指向該運行模式的??臻g,這樣,當程序的運行進(jìn)入異常模式時(shí),可以將需要保護的寄存器放入R13所指向的堆棧,而當程序從異常模式返回時(shí),則從對應的堆棧中恢復,采用這種方式可以保證異常發(fā)生后程序的正常執行*/
bl InitStacks/*跳轉至其它堆棧初始化程序并返回*/
/*設置IRQ中斷處理*/
/*44B0有兩種中斷模式:一種是沒(méi)有中斷向量表;一種是使用了中斷向量表,使用中斷向量表只能是IRQ方式。當使用中斷向量表的時(shí)候,中斷發(fā)生時(shí)由S3C44B0的中斷控制器根據中斷向量表,利用硬件方式自動(dòng)跳轉到相應的中斷處理服務(wù)程序所在的位置;不使用中斷向量表時(shí)按下面的代碼,利用軟件方式跳轉而進(jìn)行中斷處理,因為S3C44B0有30個(gè)中斷源,所以需要程序判斷以確定調用那個(gè)中斷服務(wù)程序*/
ldr r0,=HandleIRQ/*如果在0x18和0x1c地址處無(wú)“subs pc,lr,#4”*/
ldr r1,=IsrIRQ/*為了中斷正常返回這些語(yǔ)句是必須的 */
str r1,[r0]
/*拷貝讀寫(xiě)區域數據/數據區準備,將系統需要讀寫(xiě)的數據和變量從ROM拷貝到RAM里。Image_RO_Limit、Image_RW_Base、Image_ZI_Base等這些符號還會(huì )在另外的鏈接腳本文件中出現,這些符號是用來(lái)定位程序各個(gè)段的參考信息。集成開(kāi)發(fā)環(huán)境在編譯鏈接的時(shí)候會(huì )根據我們編寫(xiě)的程序,把它們轉換成用來(lái)對各個(gè)段定位的地址信息*/
LDR r0, =Image_RO_Limit/*取只讀數據區域地址指針*/
LDR r1, =Image_RW_Base/*準備執行拷貝操作*/
LDR r3, =Image_ZI_Base
CMP r0, r1 /*檢查是否相同*/
BEQ F1 /*相同則跳過(guò)拷貝操作*/
F0:
CMP r1, r3/*執行拷貝操作*/
LDRCC r2, [r0], #4
STRCC r2, [r1], #4
BCC F0
F1:
LDR r1, =Image_ZI_Base/*零數據準備區起始地址*/
MOV r2, #0
F2:
CMP r3, r1 /*執行數據區清零*/
STRCC r2, [r3], #4
BCC F2
MRSr0, CPSR
BICr0, r0, #NOINT /*中斷請求允許*/
MSRCPSR_cxsf, r0
/* 跳轉到C入口程序 */
BLMain
B.
四.總結:
啟動(dòng)過(guò)程中的初始化程序就是初始化CPU內部各個(gè)關(guān)鍵的寄存器、配置外圍硬件電路相關(guān)寄存器、建立中斷向量表等,然后跳轉到一般由高級語(yǔ)言編寫(xiě)的主函數的應用程序代碼去執行,這樣就可以利用高級語(yǔ)言來(lái)編寫(xiě)完成系統設計所要求的各種功能。初始化的過(guò)程對大多數初學(xué)者來(lái)說(shuō),比較難理解的是中斷的處理和一些少見(jiàn)的操作符號,這些符號多是一些宏定義或系統用于在內存空間中對各個(gè)段的定位標識符號。掌握了S3C44B0的啟動(dòng)代碼之后,對系統功能程序設計會(huì )起到很大的幫助,是進(jìn)行下一步程序設計的基礎。
參考文獻:
[1].ARM7TDMIdatasheethttp://www.dzsc.com/datasheet/ARM7TDMI_139812.html.
評論