基于A(yíng)RM的嵌入式系統Bootloader啟動(dòng)流程分析
一.引言:
對于PC機,其開(kāi)機后的初始化處理器配置、硬件初始化等操作是由BIOS(Basic Input /Output System)完成的,但對于嵌入式系統來(lái)說(shuō),出于經(jīng)濟性、價(jià)格方面的考慮一般不配置BIOS,因此我們必須自行編寫(xiě)完成這些工作的程序,這就是所需要的開(kāi)機程序。而在嵌入式系統中,通常并沒(méi)有像 BIOS 那樣的固件程序,啟動(dòng)時(shí)用于完成初始化操作的這段代碼被稱(chēng)為Bootloader程序,因此整個(gè)系統的加載啟動(dòng)任務(wù)就完全由Bootloader 來(lái)完成。簡(jiǎn)單地說(shuō),通過(guò)這段程序,可以初始化硬件設備、建立內存空間的映射圖(有的CPU沒(méi)有內存映射功能如S3C44B0),從而將系統的軟硬件環(huán)境設定在一個(gè)合適的狀態(tài),以便為最終調用操作系統內核、運行用戶(hù)應用程序準備好正確的環(huán)境。Bootloader依賴(lài)于實(shí)際的硬件和應用環(huán)境,因此要為嵌入式系統建立一個(gè)通用、標準的Bootloader是非常困難的。Bootloader也依賴(lài)于具體的嵌入式板級設備的配置,這也就是說(shuō),對于兩塊不同的嵌入式主板而言,即使它們是基于同一 CPU 而構建,要想讓運行在一塊板子上的 Bootloader 程序也能運行在另一塊板子上,通常都需要修改 Bootloader 的源程序。
二.啟動(dòng)流程
系統加電復位后,幾乎所有的 CPU都從由復位地址上取指令。比如,基于 ARM7TDMI內核的CPU在復位時(shí)通常都從地址 0x00000000處取它的第一條指令。而以微處理器為核心的嵌入式系統通常都有某種類(lèi)型的固態(tài)存儲設備(比如EEPROM、FLASH等)被映射到這個(gè)預先設置好的地址上。因此在系統加電復位后,處理器將首先執行存放在復位地址處的程序。通過(guò)集成開(kāi)發(fā)環(huán)境可以將Bootloader定位在復位地址開(kāi)始的存儲空間內,因此Bootloader是系統加電后、操作系統內核或用戶(hù)應用程序運行之前,首先必須運行的一段程序代碼。對于嵌入式系統來(lái)說(shuō),有的使用操作系統,也有的不使用操作系統,比如功能簡(jiǎn)單僅包括應用程序的系統,但在系統啟動(dòng)時(shí)都必須執行Bootloader,為系統運行準備好軟硬件運行環(huán)境。
系統的啟動(dòng)通常有兩種方式,一種是可以直接從Flash啟動(dòng),另一種是可以將壓縮的內存映像文件從Flash(為節省Flash資源、提高速度)中復制、解壓到RAM,再從RAM啟動(dòng)。當電源打開(kāi)時(shí),一般的系統會(huì )去執行ROM(應用較多的是Flash)里面的啟動(dòng)代碼。這些代碼是用匯編語(yǔ)言編寫(xiě)的,其主要作用在于初始化CPU和板上的必備硬件如內存、中斷控制器等。有時(shí)候用戶(hù)還必須根據自己板子的硬件資源情況做適當的調整與修改。
系統啟動(dòng)代碼完成基本軟硬件環(huán)境初始化后,對于有操作系統的情況下,啟動(dòng)操作系統、啟動(dòng)內存管理、任務(wù)調度、加載驅動(dòng)程序等,最后執行應用程序或等待用戶(hù)命令;對于沒(méi)有操作系統的系統直接執行應用程序或等待用戶(hù)命令。
啟動(dòng)代碼是用來(lái)初始化電路以及用來(lái)為高級語(yǔ)言寫(xiě)的軟件做好運行前準備的一小段匯編語(yǔ)言,在商業(yè)實(shí)時(shí)操作系統中,啟動(dòng)代碼部分一般被稱(chēng)為板級支持包,英文縮寫(xiě)為BSP。它的主要功能就是:電路初始化和為高級語(yǔ)言編寫(xiě)的軟件運行做準備。系統啟動(dòng)流程如圖1所示,主要的過(guò)程如下:
1.啟動(dòng)代碼的第一步是設置中斷和異常向量。
2.完成系統啟動(dòng)所必須的最小配置,某些處理器芯片包含一個(gè)或幾個(gè)全局寄存器,這些寄存器必須在系統啟動(dòng)的最初進(jìn)行配置。
3.設置看門(mén)狗,用戶(hù)設計的部分外圍電路如果必須在系統啟動(dòng)時(shí)初始化,就可以放在這一步。
4.配置系統所使用的存儲器,包括Flash,SRAM和DRAM等,并為他們分配地址空間。如果系統使用了DRAM或其它外設,就需要設置相關(guān)的寄存器,以確定其刷新頻率,數據總線(xiàn)寬度等信息,初始化存儲器系統。有些芯片可通過(guò)寄存器編程初始化存儲器系統,而對于較復雜系統通常集成有MMU來(lái)管理內存空間。
5.為處理器的每個(gè)工作模式設置棧指針,ARM處理器有多種工作模式,每種工作模式都需要設置單獨的??臻g。
6.變量初始化,這里的變量指的是在軟件中定義的已經(jīng)賦好初值的全局變量,啟動(dòng)過(guò)程中需要將這部分變量從只讀區域,也就是Flash拷貝到讀寫(xiě)區域中,因為這部分變量的值在軟件運行時(shí)有可能重新賦值。還有一種變量不需要處理,就是已經(jīng)賦好初值的靜態(tài)全局變量,這部分變量在軟件運行過(guò)程中不會(huì )改變,因此可以直接固化在只讀的Flash或EEPROM中。
7.數據區準備,對于軟件中所有未賦初值的全局變量,啟動(dòng)過(guò)程中需要將這部分變量所在區域全部清零。
8.最后一步是調用高級語(yǔ)言入口函數,比如main函數等。
三.程序分析
下面根據實(shí)際經(jīng)過(guò)測試的代碼詳細講述系統的啟動(dòng)過(guò)程。
.text/*將此操作符開(kāi)始的代碼編譯到代碼段或代碼段子段中*/
/* 集成開(kāi)發(fā)環(huán)境(IDE)可以通過(guò)鏈接腳本文件將下面的語(yǔ)句定位在零起始地址,系統上電后CPU從此處開(kāi)始執行*/
ENTRY:
b ResetHandler /*跳至ResetHandler,此句被定位在零起始地址*/
/*除用戶(hù)模式外的其他6種模式稱(chēng)為特權模式。特權操作模式主要處理異常和監控調用(有時(shí)稱(chēng)為軟件中斷),它們可以自由的訪(fǎng)問(wèn)系統資源和改變模式。特權模式中除系統模式以外的5種模式又稱(chēng)為異常模式,下面的代碼用于出現異常時(shí)CPU就會(huì )根據以下的語(yǔ)句自動(dòng)跳轉到對應的異常處理程序處*/
b HandlerUndef /* handlerUndef */
b HandlerSWI /* SWI interrupt handler */
b HandlerPabort /* handlerPAbort */
b HandlerDabort /* handlerDAbort */
b . /* handlerReserved */
b HandlerIRQ
b HandlerFIQ
… ...
… ...
ResetHandler: /*上電后跳轉到此處開(kāi)始執行*/
Ldrr0,=WTCON /*禁止看門(mén)狗*/
ldr r1,=0x0
str r1,[r0]
ldr r0,=INTMSK /*屏蔽所有中斷請求 */
ldr r1,=0x07ffffff
str r1,[r0]
評論