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

          新聞中心

          ARM核的Bootloader代碼

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

          一.Bootloader

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

          是 ARM系統(tǒng)的開機(jī)程序,用匯編語言編寫,完成系統(tǒng)的初始化操作.是系統(tǒng)上電復(fù)位后,操作系統(tǒng)或用戶應(yīng)用程序運(yùn)行前,首先必須運(yùn)行的一段程序.

          作用:1,初始化硬件; 2,建立內(nèi)存空間的映射圖(有的CPU沒有內(nèi)存映射功能如S3C44B0).

          二. 啟動(dòng)流程

          2種啟動(dòng)方式:

          • 直接從Flash 啟動(dòng)
          • 將壓縮的內(nèi)存映像文件從Flash中復(fù)制,解壓到RAM,再從RAM啟動(dòng)

          (節(jié)省Flash資源,提高速度)

          啟動(dòng)流程圖:

          1. 啟動(dòng)代碼的第一步是設(shè)置中斷和異常向量

          2. 完成系統(tǒng)啟動(dòng)所必須的最小配置.

          某些處理器芯片包含一個(gè)或幾個(gè)全局寄存器,這些寄存器必須在系統(tǒng)啟動(dòng)的最初進(jìn)行配置.

          3. 設(shè)置看門狗,擁護(hù)設(shè)置的部分外圍電路如果必須在系統(tǒng)啟動(dòng)時(shí)初始化,就可以放在這一步.

          4. 配置系統(tǒng)所使用的寄存器,包括Flash,SRAM,DRAM等,并為他們分配地址空間.如果系統(tǒng)使用了DRAM或其他外設(shè),就需要設(shè)置相關(guān)的寄存器,以確定其刷新頻率,數(shù)據(jù)總線寬度等信息,初始化存儲(chǔ)器系統(tǒng)

          有些芯片可通過寄存器編程初始化存儲(chǔ)器系統(tǒng),而對(duì)于較復(fù)雜系統(tǒng)通常集成有 MMU 來管理內(nèi)存空間。

          5. 為處理器的每個(gè)工作模式設(shè)置棧指針.
          ARM 處理器有多種工作模式,每種工作模式都需要設(shè)置單獨(dú)的??臻g。
          6. 變量初始化.

          這里的變量指的是在軟件中定義的已經(jīng)賦好初值的全局變量,啟動(dòng)過程中需要將這部分變量從只讀區(qū)域,也就是 Flash 拷貝到讀寫區(qū)域中,因?yàn)檫@部分變量的值在軟件運(yùn)行時(shí)有可能重新賦值。還有一種變量不需要處理,就是已經(jīng)賦好初值的靜態(tài)全局變量,這部分變量在軟件運(yùn)行過程中不會(huì)改變,因此可以直接固化在只讀的 Flash 或 EEPROM 中。
          7. 數(shù)據(jù)區(qū)準(zhǔn)備

          對(duì)于軟件中所有未賦初值的全局變量,啟動(dòng)過程中需要將這部分變量所在區(qū)域全部清零。
          8. 調(diào)用高級(jí)語言函數(shù).比如 main 函數(shù)等。
          三.程序分析

          下面根據(jù)實(shí)際經(jīng)過測試的代碼詳細(xì)講述系統(tǒng)的啟動(dòng)過程。
          .text/* 將此操作符開始的代碼編譯到代碼段或代碼段子段中 */

          /* 集成開發(fā)環(huán)境( IDE )可以通過鏈接腳本文件將下面的語句定位在零起始地址,系統(tǒng)上電后 CPU 從此處開始執(zhí)行 */
          ENTRY:/*用于指定匯編程序的入口點(diǎn)*/
          b ResetHandler/* 跳至 ResetHandler ,此句被定位在零起始地址 */
          /* 除用戶模式外的其他 6 種模式稱為特權(quán)模式。特權(quán)操作模式主要處理異常和監(jiān)控調(diào)用(有時(shí)稱為軟件中斷),它們可以自由的訪問系統(tǒng)資源和改變模式。特權(quán)模式中除系統(tǒng)模式以外的 5 種模式又稱為異常模式,下面的代碼用于出現(xiàn)異常時(shí) CPU 就會(huì)根據(jù)以下的語句自動(dòng)跳轉(zhuǎn)到對(duì)應(yīng)的異常處理程序處 */
          b HandlerUndef /* handlerUndef */
          b HandlerSWI /* SWI interrupt handler */
          b HandlerPabort /* handlerPAbort */
          b HandlerDabort /* handlerDAbort */
          b . /* handlerReserved */
          b HandlerIRQ
          b HandlerFIQ
          ...
          ...
          ResetHandler:/* 上電后跳轉(zhuǎn)到此處開始執(zhí)行 */
          LDR R0, =WTCON/* 禁止看門狗 */
          LDR R1, =0x0
          STRR1, [R0]
          LDRR0, =INTMSK /* 屏蔽所有中斷請(qǐng)求 */
          LDR R1, =0x07FFFFFF

          STRR1, [R0]
          /* 設(shè)置時(shí)鐘控制寄存器 */
          ldrr0,=LOCKTIME
          ldrr1,=0xfff
          strr1,[r0]
          .if PLLONSTART
          ldrr0,=PLLCON/* 設(shè)置 PLL */
          ldrr1,=((M_DIV<<12)+(P_DIV<<4)+S_DIV)/*Fin=8MHz,Fout=64MHz*/
          strr1,[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è)置存儲(chǔ)器控制寄存器,存儲(chǔ)器的配置數(shù)據(jù)都存儲(chǔ)在 SMRDATA 為起始地址的數(shù)據(jù)表中,下面的代碼可以一次將預(yù)先配置好的初始化數(shù)據(jù)存入與存儲(chǔ)器控制器相關(guān)的 13 個(gè)寄存器,這些寄存器則是以 0x01c80000 為起始地址的 13 個(gè)連續(xù)的 32 位寄存器 */
          ldr r0,=SMRDATA
          ldmia r0,{r1-r13}
          ldr r0,=0x01c80000 /* BWSCON 存儲(chǔ)控制寄存器地址 */
          stmia r0,{r1-r13}
          /* 初始化堆棧 */
          /* CPU 復(fù)位后是處于管理模式下的,所以首先要初始化管理模式下的堆棧寄存器 */
          ldr sp, =SVCStack
          /* 由于處理器的每種運(yùn)行模式都要有自己獨(dú)立的物理堆棧寄存器 R13 ,在用戶應(yīng)用程序的初始化部分,一般都要初始化每種模式下的 R13 ,使其指向該運(yùn)行模式的??臻g,這樣,當(dāng)程序的運(yùn)行進(jìn)入異常模式時(shí),可以將需要保護(hù)的寄存器放入 R13 所指向的堆棧,而當(dāng)程序從異常模式返回時(shí),則從對(duì)應(yīng)的堆棧中恢復(fù),采用這種方式可以保證異常發(fā)生后程序的正常執(zhí)行 */
          bl InitStacks/* 跳轉(zhuǎn)至其它堆棧初始化程序并返回 */
          /* 設(shè)置 IRQ 中斷處理 */
          /*44B0 有兩種中斷模式:一種是沒有中斷向量表;一種是使用了中斷向量表,使用中斷向量表只能是 IRQ 方式。當(dāng)使用中斷向量表的時(shí)候,中斷發(fā)生時(shí)由 S3C44B0 的中斷控制器根據(jù)中斷向量表,利用硬件方式自動(dòng)跳轉(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 等這些符號(hào)還會(huì)在另外的鏈接腳本文件中出現(xiàn),這些符號(hào)是用來定位程序各個(gè)段的參考信息。集成開發(fā)環(huán)境在編譯鏈接的時(shí)候會(huì)根據(jù)我們編寫的程序,把它們轉(zhuǎn)換成用來對(duì)各個(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

          MRSr0, CPSR
          BICr0, r0, #NOINT /* 中斷請(qǐng)求允許 */
          MSRCPSR_cxsf, r0
          /* 跳轉(zhuǎn)到 C 入口程序 */
          BLMain
          B .

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




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

          評(píng)論


          技術(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); })();