<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          ARM bootloader程序的理解

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

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

          本文引用地址:http://www.ex-cimer.com/article/201611/317085.htm

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

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

          1)初始化棧.

          2)中斷向量表的復(fù)制.

          3)TCM 和cache的配置,如果有操作系統(tǒng)的話,就應(yīng)該設(shè)置MMU.

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

          5)對內(nèi)存如mddr,sram進(jìn)行簡單的測試.

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

          一、初始化棧:

          應(yīng)該對irq,firq,svc的棧進(jìn)行指定,分別操作這幾中模式的寄存器。如對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.

          四、建立一個程序運(yùn)行文境:

          image(bin文件)包括倆部分:RO and RW,RO部分一般我們在加載前后的位置都不用變化,但是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

          五、對內(nèi)存進(jìn)行測試:

          由于系統(tǒng)中有各種各樣的內(nèi)存,可以對內(nèi)存進(jìn)行簡單測試。

          六、UART的配置:

          UART在嵌入式系統(tǒng)中很重要,雖然它很簡單,但是在早期開發(fā)中,UART是必須的設(shè)備之一。UART作為下一篇中將進(jìn)一步詳細(xì)討論。



          關(guān)鍵詞: ARMbootloader程

          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();