日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

基于ARM的嵌入式系統(tǒng)Bootloader啟動流程分析

出處:guorock 發(fā)布于:2007-04-19 09:24:42

一. 引言:
    對于PC機,其開機后的初始化處理器配置、硬件初始化等操作是由BIOS(Basic Input /Output System)完成的,但對于嵌入式系統(tǒng)來說,出于經(jīng)濟性、價格方面的考慮一般不配置BIOS,因此我們必須自行編寫完成這些工作的程序,這就是所需要的開機程序。而在嵌入式系統(tǒng)中,通常并沒有像 BIOS 那樣的固件程序,啟動時用于完成初始化操作的這段代碼被稱為Bootloader程序,因此整個系統(tǒng)的加載啟動任務(wù)就完全由Bootloader 來完成。簡單地說,通過這段程序,可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖(有的CPU沒有內(nèi)存映射功能如S3C44B0),從而將系統(tǒng)的軟硬件環(huán)境設(shè)定在一個合適的狀態(tài),以便為終調(diào)用操作系統(tǒng)內(nèi)核、運行用戶應(yīng)用程序準(zhǔn)備好正確的環(huán)境。Bootloader依賴于實際的硬件和應(yīng)用環(huán)境,因此要為嵌入式系統(tǒng)建立一個通用、標(biāo)準(zhǔn)的Bootloader是非常困難的。Bootloader也依賴于具體的嵌入式板級設(shè)備的配置,這也就是說,對于兩塊不同的嵌入式主板而言,即使它們是基于同一 CPU 而構(gòu)建,要想讓運行在一塊板子上的 Bootloader 程序也能運行在另一塊板子上,通常都需要修改 Bootloader 的源程序。

二. 啟動流程
    系統(tǒng)加電復(fù)位后,幾乎所有的 CPU都從由復(fù)位地址上取指令。比如,基于 ARM7TDMI內(nèi)核的CPU在復(fù)位時通常都從地址 0x00000000處取它的條指令。而以微處理器為的嵌入式系統(tǒng)通常都有某種類型的固態(tài)存儲設(shè)備(比如EEPROM、FLASH等)被映射到這個預(yù)先設(shè)置好的地址上。因此在系統(tǒng)加電復(fù)位后,處理器將首先執(zhí)行存放在復(fù)位地址處的程序。通過集成開發(fā)環(huán)境可以將Bootloader定位在復(fù)位地址開始的存儲空間內(nèi),因此Bootloader是系統(tǒng)加電后、操作系統(tǒng)內(nèi)核或用戶應(yīng)用程序運行之前,首先必須運行的一段程序代碼。對于嵌入式系統(tǒng)來說,有的使用操作系統(tǒng),也有的不使用操作系統(tǒng),比如功能簡單僅包括應(yīng)用程序的系統(tǒng),但在系統(tǒng)啟動時都必須執(zhí)行Bootloader,為系統(tǒng)運行準(zhǔn)備好軟硬件運行環(huán)境。
     系統(tǒng)的啟動通常有兩種方式,一種是可以直接從Flash啟動,另一種是可以將壓縮的內(nèi)存映像文件從Flash(為節(jié)省Flash資源、提高速度)中復(fù)制、解壓到RAM,再從RAM啟動。當(dāng)電源打開時,一般的系統(tǒng)會去執(zhí)行ROM(應(yīng)用較多的是Flash)里面的啟動代碼。這些代碼是用匯編語言編寫的,其主要作用在于初始化CPU和板上的必備硬件如內(nèi)存、中斷控制器等。有時候用戶還必須根據(jù)自己板子的硬件資源情況做適當(dāng)?shù)恼{(diào)整與修改。
    系統(tǒng)啟動代碼完成基本軟硬件環(huán)境初始化后,對于有操作系統(tǒng)的情況下,啟動操作系統(tǒng)、啟動內(nèi)存管理、任務(wù)調(diào)度、加載驅(qū)動程序等,執(zhí)行應(yīng)用程序或等待用戶命令;對于沒有操作系統(tǒng)的系統(tǒng)直接執(zhí)行應(yīng)用程序或等待用戶命令。
    啟動代碼是用來初始化電路以及用來為語言寫的軟件做好運行前準(zhǔn)備的一小段匯編語言,在商業(yè)實時操作系統(tǒng)中,啟動代碼部分一般被稱為板級支持包,英文縮寫為BSP。它的主要功能就是:電路初始化和為語言編寫的軟件運行做準(zhǔn)備。系統(tǒng)啟動流程如所示,主要的過程如下:


    1. 啟動代碼的步是設(shè)置中斷和異常向量。
    2. 完成系統(tǒng)啟動所必須的配置,某些處理器芯片包含一個或幾個全局寄存器,這些寄存器必須在系統(tǒng)啟動的初進行配置。
    3. 設(shè)置看門狗,用戶設(shè)計的部分外圍電路如果必須在系統(tǒng)啟動時初始化,就可以放在這一步。
    4. 配置系統(tǒng)所使用的存儲器,包括Flash,SRAM和DRAM等,并為他們分配地址空間。如果系統(tǒng)使用了DRAM或其它外設(shè),就需要設(shè)置相關(guān)的寄存器,以確定其刷新頻率,數(shù)據(jù)總線寬度等信息,初始化存儲器系統(tǒng)。有些芯片可通過寄存器編程初始化存儲器系統(tǒng),而對于較復(fù)雜系統(tǒng)通常集成有MMU來管理內(nèi)存空間。
    5. 為處理器的每個工作模式設(shè)置棧指針,ARM處理器有多種工作模式,每種工作模式都需要設(shè)置單獨的??臻g。
    6. 變量初始化,這里的變量指的是在軟件中定義的已經(jīng)賦好初值的全局變量,啟動過程中需要將這部分變量從只讀區(qū)域,也就是Flash拷貝到讀寫區(qū)域中,因為這部分變量的值在軟件運行時有可能重新賦值。還有一種變量不需要處理,就是已經(jīng)賦好初值的靜態(tài)全局變量,這部分變量在軟件運行過程中不會改變,因此可以直接固化在只讀的Flash或EEPROM中。
    7. 數(shù)據(jù)區(qū)準(zhǔn)備,對于軟件中所有未賦初值的全局變量,啟動過程中需要將這部分變量所在區(qū)域全部清零。
    8. 一步是調(diào)用語言入口函數(shù),比如main函數(shù)等。

三. 程序分析
    下面根據(jù)實際經(jīng)過測試的代碼詳細(xì)講述系統(tǒng)的啟動過程。
    .text      /*將此操作符開始的代碼編譯到代碼段或代碼段子段中*/
    /* 集成開發(fā)環(huán)境(IDE)可以通過鏈接腳本文件將下面的語句定位在零起始地址,系統(tǒng)上電后CPU從此處開始執(zhí)行*/
    ENTRY:
        b ResetHandler   /*跳至ResetHandler,此句被定位在零起始地址*/
/*除用戶模式外的其他6種模式稱為特權(quán)模式。特權(quán)操作模式主要處理異常和監(jiān)控調(diào)用(有時稱為軟件中斷),它們可以自由的訪問系統(tǒng)資源和改變模式。特權(quán)模式中除系統(tǒng)模式以外的5種模式又稱為異常模式,下面的代碼用于出現(xiàn)異常時CPU就會根據(jù)以下的語句自動跳轉(zhuǎn)到對應(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
    str     r1,[r0]
    ldr     r0,=INTMSK    /*屏蔽所有中斷請求 */
    ldr     r1,=0x07ffffff
    str     r1,[r0]
 /*設(shè)置時鐘控制寄存器*/
    ldr  r0,=LOCKTIME
    ldr  r1,=0xfff
    str  r1,[r0]
.if PLLONSTART
 ldr  r0,=PLLCON   /* 設(shè)置PLL */
 ldr  r1,=((M_DIV<<12)+(P_DIV<<4)+S_DIV) /*Fin=8MHz,Fout=64MHz*/
 str  r1,[r0]
.endif
    ldr     r0,=CLKCON 
    ldr     r1,=0x7ff8      /*所有單元時鐘允許*/
    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個寄存器,這些寄存器則是以0x01c80000為起始地址的13個連續(xù)的32位寄存器*/
    ldr     r0,=SMRDATA
    ldmia   r0,{r1-r13}
    ldr     r0,=0x01c80000    /* BWSCON存儲控制寄存器地址 */
    stmia   r0,{r1-r13}
/*初始化堆棧*/
/* CPU復(fù)位后是處于管理模式下的,所以首先要初始化管理模式下的堆棧寄存器*/
    ldr     sp, =SVCStack
    /*由于處理器的每種運行模式都要有自己獨立的物理堆棧寄存器R13,在用戶應(yīng)用程序的初始化部分,一般都要初始化每種模式下的R13,使其指向該運行模式的棧空間,這樣,當(dāng)程序的運行進入異常模式時,可以將需要保護的寄存器放入R13所指向的堆棧,而當(dāng)程序從異常模式返回時,則從對應(yīng)的堆棧中恢復(fù),采用這種方式可以保證異常發(fā)生后程序的正常執(zhí)行*/
     bl     InitStacks   /*跳轉(zhuǎn)至其它堆棧初始化程序并返回*/
 /*設(shè)置IRQ中斷處理*/
/*44B0有兩種中斷模式:一種是沒有中斷向量表;一種是使用了中斷向量表,使用中斷向量表只能是IRQ方式。當(dāng)使用中斷向量表的時候,中斷發(fā)生時由S3C44B0的中斷控制器根據(jù)中斷向量表,利用硬件方式自動跳轉(zhuǎn)到相應(yīng)的中斷處理服務(wù)程序所在的位置;不使用中斷向量表時按下面的代碼,利用軟件方式跳轉(zhuǎn)而進行中斷處理,因為S3C44B0有30個中斷源,所以需要程序判斷以確定調(diào)用那個中斷服務(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),這些符號是用來定位程序各個段的參考信息。集成開發(fā)環(huán)境在編譯鏈接的時候會根據(jù)我們編寫的程序,把它們轉(zhuǎn)換成用來對各個段定位的地址信息*/
    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)部各個關(guān)鍵的寄存器、配置外圍硬件電路相關(guān)寄存器、建立中斷向量表等,然后跳轉(zhuǎn)到一般由語言編寫的主函數(shù)的應(yīng)用程序代碼去執(zhí)行,這樣就可以利用語言來編寫完成系統(tǒng)設(shè)計所要求的各種功能。初始化的過程對大多數(shù)初學(xué)者來說,比較難理解的是中斷的處理和一些少見的操作符號,這些符號多是一些宏定義或系統(tǒng)用于在內(nèi)存空間中對各個段的定位標(biāo)識符號。掌握了S3C44B0的啟動代碼之后,對系統(tǒng)功能程序設(shè)計會起到很大的幫助,是進行下一步程序設(shè)計的基礎(chǔ)。


  

參考文獻(xiàn):

[1]. ARM7TDMI datasheet http://www.hbjingang.com/datasheet/ARM7TDMI_139812.html.


關(guān)鍵詞:基于ARM的嵌入式系統(tǒng)Bootloader啟動流程分析S3C44B08MHZ64MHZARM7TDMI

版權(quán)與免責(zé)聲明

凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。

如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

STM32工控板常用的8MHz晶振有何妙用?
廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時間周一至周五
9:00-17:30

關(guān)注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務(wù)的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!