新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM bootloader程序的理解

        ARM bootloader程序的理解

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

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

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

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

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

        1)初始化棧.

        2)中斷向量表的復制.

        3)TCM 和cache的配置,如果有操作系統的話,就應該設置MMU.

        4)建立一個程序執行文境.(具體一點,就是根據image文件的屬性來處理image段的數據).

        5)對內存如mddr,sram進行簡單的測試.

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

        一、初始化棧:

        應該對irq,firq,svc的棧進行指定,分別操作這幾中模式的寄存器。如對irq模式.

        mov r0 , #0x12; irq mode

        msrCPSR , r0; set irq mode

        ldr sp, =0x800; irq steak address

        二、中斷向量表的復制:

        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是有區別的,雖然都是為了加快速度,但是TCM必須給它指定地址,TCM和cache的用途也不樣,TCM保存常用到的數據如中斷向量表和realtime數據,而cache只是為了加快處理器和外設之間的數據處理。


        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.

        四、建立一個程序運行文境:

        image(bin文件)包括倆部分:RO and RW,RO部分一般我們在加載前后的位置都不用變化,但是RW必須在加載后把他放到RAM中執行,所以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段的結束地址+1load rw段數據
        strccr3,[r1],#4;重新寫入到rw段
        b%B4
        4

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

        五、對內存進行測試:

        由于系統中有各種各樣的內存,可以對內存進行簡單測試。

        六、UART的配置:

        UART在嵌入式系統中很重要,雖然它很簡單,但是在早期開發中,UART是必須的設備之一。UART作為下一篇中將進一步詳細討論。



        關鍵詞: ARMbootloader程

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 盖州市| 太仓市| 大丰市| 永城市| 彭山县| 三门县| 鹤庆县| 集贤县| 全州县| 巴彦县| 顺昌县| 特克斯县| 连州市| 额敏县| 洮南市| 东山县| 乐清市| 湖南省| 大冶市| 喀喇沁旗| 辰溪县| 邯郸市| 霍州市| 阳泉市| 新田县| 盘山县| 城口县| 突泉县| 米易县| 潜山县| 财经| 安丘市| 弥渡县| 遂川县| 乃东县| 马公市| 奎屯市| 健康| 利辛县| 城口县| 沅江市|