新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于ARM核的Bootloader代碼的分析與設計

        基于ARM核的Bootloader代碼的分析與設計

        作者: 時間:2018-09-14 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/201809/389170.htm

        ldr r1,=0xfff

        str r1,[r0]

        .if PLLONSTART

        ldr r0,=PLLCON /* 設置 PLL */

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

        str r1,[r0]

        .endif

        ldr r0,=CLKCON

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

        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 為起始地址的數據表中,下面的代碼可以一次將預先配置好的初始化數據存入與存儲器控制器相關的 13 個寄存器,這些寄存器則是以 0x01c80000 為起始地址的 13 個連續的 32 位寄存器 */

        ldr r0,=SMRDATA

        ldmia r0,{r1-r13}

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

        stmia r0,{r1-r13}

        /* 初始化堆棧 */

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

        ldr sp, =SVCStack

        /* 由于處理器的每種運行模式都要有自己獨立的物理堆棧寄存器 R13 ,在用戶應用程序的初始化部分,一般都要初始化每種模式下的 R13 ,使其指向該運行模式的??臻g,這樣,當程序的運行進入異常模式時,可以將需要保護的寄存器放入 R13 所指向的堆棧,而當程序從異常模式返回時,則從對應的堆棧中恢復,采用這種方式可以保證異常發生后程序的正常執行 */

        bl InitStacks /* 跳轉至其它堆棧初始化程序并返回 */

        /* 設置 IRQ 中斷處理 */

        /*44B0 有兩種中斷模式:一種是沒有中斷向量表;一種是使用了中斷向量表,使用中斷向量表只能是 IRQ 方式。當使用中斷向量表的時候,中斷發生時由 S3C44B0 的中斷控制器根據中斷向量表,利用硬件方式自動跳轉到相應的中斷處理服務程序所在的位置;不使用中斷向量表時按下面的代碼,利用軟件方式跳轉而進行中斷處理,因為 S3C44B0 有 30 個中斷源,所以需要程序判斷以確定調用那個中斷服務程序 */

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

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

        str r1,[r0]

        /* 拷貝讀寫區域數據 / 數據區準備,將系統需要讀寫的數據和變量從 ROM 拷貝到 RAM 里。 Image_RO_Limit 、 Image_RW_Base 、 Image_ZI_Base 等這些符號還會在另外的鏈接腳本文件中出現,這些符號是用來定位程序各個段的參考信息。集成開發環境在編譯鏈接的時候會根據我們編寫的程序,把它們轉換成用來對各個段定位的地址信息 */

        LDR r0, =Image_RO_Limit /* 取只讀數據區域地址指針 */

        LDR r1, =Image_RW_Base /* 準備執行拷貝操作 */

        LDR r3, =Image_ZI_Base

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

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

        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

        MRS r0, CPSR

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

        MSR CPSR_cxsf, r0

        /* 跳轉到 C 入口程序 */

        BL Main

        B .

        四 . 總結:

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


        上一頁 1 2 下一頁

        關鍵詞: ARM核 Bootloader代碼

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 偏关县| 澎湖县| 龙口市| 山丹县| 麻阳| 虎林市| 祁东县| 两当县| 深州市| 襄城县| 遵义市| 民勤县| 阳泉市| 敦化市| 宜城市| 常宁市| 张掖市| 中山市| 自治县| 德昌县| 德阳市| 祁阳县| 永春县| 万全县| 黄冈市| 杭锦后旗| 抚远县| 宜兰市| 光山县| 高雄县| 靖安县| 金阳县| 中卫市| 翼城县| 苏州市| 祁门县| 金沙县| 乌兰县| 阿瓦提县| 秦皇岛市| 建平县|