當(dāng)前位置:首頁 > 嵌入式 > 嵌入式硬件
[導(dǎo)讀]一 . 引言:對(duì)于 PC 機(jī),其開機(jī)后的初始化處理器配置、硬件初始化等操作是由 BIOS ( Basic Input /Output System )完成的,但對(duì)于嵌入式系統(tǒng)來說,出于經(jīng)濟(jì)性、價(jià)格方面的

一 . 引言:

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

二 . 啟動(dòng)流程

系統(tǒng)加電復(fù)位后,幾乎所有的 CPU 都從由復(fù)位地址上取指令。比如,基于 ARM7TDMI內(nèi)核的CPU 在復(fù)位時(shí)通常都從地址 0x00000000 處取它的第一條指令。而以微處理器為核心的嵌入式系統(tǒng)通常都有某種類型的固態(tài)存儲(chǔ)設(shè)備(比如 EEPROM 、 FLASH 等)被映射到這個(gè)預(yù)先設(shè)置好的地址上。因此在系統(tǒng)加電復(fù)位后,處理器將首先執(zhí)行存放在復(fù)位地址處的程序。通過集成開發(fā)環(huán)境可以將 Bootloader 定位在復(fù)位地址開始的存儲(chǔ)空間內(nèi),因此 Bootloader 是系統(tǒng)加電后、操作系統(tǒng)內(nèi)核或用戶應(yīng)用程序運(yùn)行之前,首先必須運(yùn)行的一段程序代碼。對(duì)于嵌入式系統(tǒng)來說,有的使用操作系統(tǒng),也有的不使用操作系統(tǒng),比如功能簡(jiǎn)單僅包括應(yīng)用程序的系統(tǒng),但在系統(tǒng)啟動(dòng)時(shí)都必須執(zhí)行Bootloader ,為系統(tǒng)運(yùn)行準(zhǔn)備好軟硬件運(yùn)行環(huán)境。

系統(tǒng)的啟動(dòng)通常有兩種方式,一種是可以直接從Flash啟動(dòng),另一種是可以將壓縮的內(nèi)存映像文件從 Flash (為節(jié)省Flash 資源、提高速度)中復(fù)制、解壓到RAM ,再?gòu)腞AM 啟動(dòng)。當(dāng)電源打開時(shí),一般的系統(tǒng)會(huì)去執(zhí)行ROM(應(yīng)用較多的是Flash)里面的啟動(dòng)代碼。這些代碼是用匯編語言編寫的,其主要作用在于初始化CPU 和板上的必備硬件如內(nèi)存、中斷控制器等。有時(shí)候用戶還必須根據(jù)自己板子的硬件資源情況做適當(dāng)?shù)恼{(diào)整與修改。

系統(tǒng)啟動(dòng)代碼完成基本軟硬件環(huán)境初始化后,對(duì)于有操作系統(tǒng)的情況下,啟動(dòng)操作系統(tǒng)、啟動(dòng)內(nèi)存管理、任務(wù)調(diào)度、加載驅(qū)動(dòng)程序等,最后執(zhí)行應(yīng)用程序或等待用戶命令;對(duì)于沒有操作系統(tǒng)的系統(tǒng)直接執(zhí)行應(yīng)用程序或等待用戶命令。

啟動(dòng)代碼是用來初始化電路以及用來為高級(jí)語言寫的軟件做好運(yùn)行前準(zhǔn)備的一小段匯編語言,在商業(yè)實(shí)時(shí)操作系統(tǒng)中,啟動(dòng)代碼部分一般被稱為板級(jí)支持包,英文縮寫為 BSP 。它的主要功能就是:電路初始化和為高級(jí)語言編寫的軟件運(yùn)行做準(zhǔn)備。系統(tǒng)啟動(dòng)流程如圖 1 所示,主要的過程如下:

 

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

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

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

4. 配置系統(tǒng)所使用的存儲(chǔ)器,包括 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)過測(cè)試的代碼詳細(xì)講述系統(tǒng)的啟動(dòng)過程。

.text /* 將此操作符開始的代碼編譯到代碼段或代碼段子段中 */

/* 集成開發(fā)環(huán)境( IDE )可以通過鏈接腳本文件將下面的語句定位在零起始地址,系統(tǒng)上電后 CPU 從此處開始執(zhí)行 */

ENTRY:

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

str r1,[r0]

ldr r0,=INTMSK /* 屏蔽所有中斷請(qǐng)求 */

ldr r1,=0x07ffffff

str r1,[r0]

/* 設(shè)置時(shí)鐘控制寄存器 */

ldr r0,=LOCKTIME[!--empirenews.page--]

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 /* 所有單元時(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

MRS r0, CPSR

BIC r0, r0, #NOINT /* 中斷請(qǐng)求允許 */

MSR CPSR_cxsf, r0

/* 跳轉(zhuǎn)到 C 入口程序 */

BL Main

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)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉