新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于ARM核的Bootloader代碼的分析與設(shè)計(jì)

基于ARM核的Bootloader代碼的分析與設(shè)計(jì)

作者: 時(shí)間:2018-09-14 來源:網(wǎng)絡(luò) 收藏

本文引用地址:http://butianyuan.cn/article/201809/389170.htm

ldr r1,=0xfff

str r1,[r0]

.if PLLONSTART

ldr r0,=PLLCON /* 設(shè)置 PLL */

ldr r1,=((M_DIV12)+(P_DIV4)+S_DIV) /*Fin=8MHz,Fout=64MHz*/

str r1,[r0]

.endif

ldr r0,=CLKCON

ldr r1,=0x7ff8 /* 所有單元時(shí)鐘允許 */

str r1,[r0]

/* 為 BDMA 設(shè)置復(fù)位值 */

ldr r0,=BDIDES0

ldr r1,=0x40000000 /* BDIDESn 復(fù)位值應(yīng)為 0x40000000 */

str r1,[r0]

ldr r0,=BDIDES1

ldr r1,=0x40000000 /* BDIDESn 復(fù)位值應(yīng)為 0x40000000 */

str r1,[r0]

/* 設(shè)置存儲器控制寄存器,存儲器的配置數(shù)據(jù)都存儲在 SMRDATA 為起始地址的數(shù)據(jù)表中,下面的代碼可以一次將預(yù)先配置好的初始化數(shù)據(jù)存入與存儲器控制器相關(guān)的 13 個(gè)寄存器,這些寄存器則是以 0x01c80000 為起始地址的 13 個(gè)連續(xù)的 32 位寄存器 */

ldr r0,=SMRDATA

ldmia r0,{r1-r13}

ldr r0,=0x01c80000 /* BWSCON 存儲控制寄存器地址 */

stmia r0,{r1-r13}

/* 初始化堆棧 */

/* CPU 復(fù)位后是處于管理模式下的,所以首先要初始化管理模式下的堆棧寄存器 */

ldr sp, =SVCStack

/* 由于處理器的每種運(yùn)行模式都要有自己獨(dú)立的物理堆棧寄存器 R13 ,在用戶應(yīng)用程序的初始化部分,一般都要初始化每種模式下的 R13 ,使其指向該運(yùn)行模式的棧空間,這樣,當(dāng)程序的運(yùn)行進(jìn)入異常模式時(shí),可以將需要保護(hù)的寄存器放入 R13 所指向的堆棧,而當(dāng)程序從異常模式返回時(shí),則從對應(yīng)的堆棧中恢復(fù),采用這種方式可以保證異常發(fā)生后程序的正常執(zhí)行 */

bl InitStacks /* 跳轉(zhuǎn)至其它堆棧初始化程序并返回 */

/* 設(shè)置 IRQ 中斷處理 */

/*44B0 有兩種中斷模式:一種是沒有中斷向量表;一種是使用了中斷向量表,使用中斷向量表只能是 IRQ 方式。當(dāng)使用中斷向量表的時(shí)候,中斷發(fā)生時(shí)由 S3C44B0 的中斷控制器根據(jù)中斷向量表,利用硬件方式自動跳轉(zhuǎn)到相應(yīng)的中斷處理服務(wù)程序所在的位置;不使用中斷向量表時(shí)按下面的代碼,利用軟件方式跳轉(zhuǎn)而進(jìn)行中斷處理,因?yàn)? S3C44B0 有 30 個(gè)中斷源,所以需要程序判斷以確定調(diào)用那個(gè)中斷服務(wù)程序 */

ldr r0,=HandleIRQ /* 如果在 0x18 和 0x1c 地址處無 “subs pc,lr,#4”*/

ldr r1,=IsrIRQ /* 為了中斷正常返回這些語句是必須的 */

str r1,[r0]

/* 拷貝讀寫區(qū)域數(shù)據(jù) / 數(shù)據(jù)區(qū)準(zhǔn)備,將系統(tǒng)需要讀寫的數(shù)據(jù)和變量從 ROM 拷貝到 RAM 里。 Image_RO_Limit 、 Image_RW_Base 、 Image_ZI_Base 等這些符號還會在另外的鏈接腳本文件中出現(xiàn),這些符號是用來定位程序各個(gè)段的參考信息。集成開發(fā)環(huán)境在編譯鏈接的時(shí)候會根據(jù)我們編寫的程序,把它們轉(zhuǎn)換成用來對各個(gè)段定位的地址信息 */

LDR r0, =Image_RO_Limit /* 取只讀數(shù)據(jù)區(qū)域地址指針 */

LDR r1, =Image_RW_Base /* 準(zhǔn)備執(zhí)行拷貝操作 */

LDR r3, =Image_ZI_Base

CMP r0, r1 /* 檢查是否相同 */

BEQ F1 /* 相同則跳過拷貝操作 */

F0:

CMP r1, r3 /* 執(zhí)行拷貝操作 */

LDRCC r2, [r0], #4

STRCC r2, [r1], #4

BCC F0

F1:

LDR r1, =Image_ZI_Base /* 零數(shù)據(jù)準(zhǔn)備區(qū)起始地址 */

MOV r2, #0

F2:

CMP r3, r1 /* 執(zhí)行數(shù)據(jù)區(qū)清零 */

STRCC r2, [r3], #4

BCC F2

MRS r0, CPSR

BIC r0, r0, #NOINT /* 中斷請求允許 */

MSR CPSR_cxsf, r0

/* 跳轉(zhuǎn)到 C 入口程序 */

BL Main

B .

四 . 總結(jié):

啟動過程中的初始化程序就是初始化 CPU 內(nèi)部各個(gè)關(guān)鍵的寄存器、配置外圍硬件電路相關(guān)寄存器、建立中斷向量表等,然后跳轉(zhuǎn)到一般由高級語言編寫的主函數(shù)的應(yīng)用程序代碼去執(zhí)行,這樣就可以利用高級語言來編寫完成系統(tǒng)設(shè)計(jì)所要求的各種功能。初始化的過程對大多數(shù)初學(xué)者來說,比較難理解的是中斷的處理和一些少見的操作符號,這些符號多是一些宏定義或系統(tǒng)用于在內(nèi)存空間中對各個(gè)段的定位標(biāo)識符號。掌握了 S3C44B0的啟動代碼之后,對系統(tǒng)功能程序設(shè)計(jì)會起到很大的幫助,是進(jìn)行下一步程序設(shè)計(jì)的基礎(chǔ)。


上一頁 1 2 下一頁

關(guān)鍵詞: ARM核 Bootloader代碼

評論


相關(guān)推薦

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

關(guān)閉