嵌入式系統(tǒng)啟動(dòng)代碼一般由兩部分構(gòu)成:引導(dǎo)代碼和操作系統(tǒng)執(zhí)行環(huán)境初始化代碼。其中引導(dǎo)代碼一般也由兩部分構(gòu)成:第一部分是板級(jí)、片級(jí)初始化代碼,主要功能是設(shè)置寄存器初始化硬件工作方式,如設(shè)置時(shí)鐘、中斷控制寄存器等,完成內(nèi)存映射、初始化MMU等;第二部分是裝載程序,其功能是將操作系統(tǒng)和應(yīng)用程序映像從只讀存儲(chǔ)器裝載拷貝到系統(tǒng)RAM中,并跳轉(zhuǎn)到相應(yīng)代碼處繼續(xù)執(zhí)行。操作系統(tǒng)執(zhí)行環(huán)境初始化代碼主要由硬件抽象層HAL代碼、設(shè)備驅(qū)動(dòng)程序初始化代碼和操作系統(tǒng)執(zhí)行體初始代碼三部分構(gòu)成。
本文以摩托羅拉MPC860處理器和具有自主知識(shí)產(chǎn)權(quán)操作系統(tǒng)CRTOSII為例,研究嵌入式系統(tǒng)引導(dǎo)程序設(shè)計(jì)和實(shí)現(xiàn)技術(shù)。嵌入式軟件開發(fā)涉及調(diào)試模式和固化模式兩種運(yùn)行狀態(tài)。調(diào)試模式主要解決如何目標(biāo)板上調(diào)試正確性未經(jīng)驗(yàn)證程序問題;而固化模式主要解決如何引導(dǎo)已調(diào)試成功程序問題。相應(yīng),引導(dǎo)代碼設(shè)計(jì)應(yīng)針對(duì)兩種模式分別進(jìn)行。
1 調(diào)試模式系統(tǒng)引導(dǎo)
1.1 調(diào)試模式引導(dǎo)代碼作用
1 調(diào)試模式系統(tǒng)引導(dǎo)
1.1 調(diào)試模式引導(dǎo)代碼作用
一個(gè)完整嵌入式軟件解決方案大致包括四方面:①硬件平臺(tái)配置初始化和系統(tǒng)引導(dǎo)代碼;②操作系統(tǒng)軟件執(zhí)行環(huán)境初始化代碼;③操作系統(tǒng);④應(yīng)用程序。
上述四方面中,引導(dǎo)代碼是本研究中力求解決問題。事實(shí)上,板級(jí)初始化、操作系統(tǒng)硬件抽象層、設(shè)備驅(qū)動(dòng)程序三者整合到一起,就構(gòu)成了嵌入式系統(tǒng)中BSP(板級(jí)支持包)主體。BSP代碼與具體目標(biāo)板硬件設(shè)計(jì)相關(guān),同時(shí)也與應(yīng)用程序設(shè)計(jì)要求相關(guān),針對(duì)應(yīng)用程序提出不同要求,例如不同設(shè)備驅(qū)動(dòng)程序、不同中斷源個(gè)數(shù)、不同中斷優(yōu)先級(jí)安排、是否啟用MMU機(jī)制等,BSP部分應(yīng)作出相應(yīng)安排。上述第四部分應(yīng)用程序是建立前三部分正確運(yùn)行基礎(chǔ)上,并需反復(fù)調(diào)試。
由上述分析可知,BSP和應(yīng)用程序代碼正確性一次編寫不能到保證,需要經(jīng)歷“調(diào)試——修改——調(diào)試”反復(fù)過程,需要建立一個(gè)可靠調(diào)試環(huán)境。該環(huán)境建立基礎(chǔ)正是調(diào)模式下引導(dǎo)代碼。
1.2 引導(dǎo)代碼調(diào)試方法
本研究實(shí)驗(yàn)采用一種稱作BDM(Background Debug Mode)OCD(On Chip Debuging)調(diào)試技術(shù)。BMD是由Motorola公司提供一種硬件調(diào)試方法,類似于JTAG調(diào)試。它利用處理器提供調(diào)試端口調(diào)試。MPC860采用一種特殊BDM——EPBDM,其運(yùn)作相當(dāng)于用處理器內(nèi)嵌調(diào)試模塊接管中斷及異常處理,用戶設(shè)置調(diào)試許可寄存器(debug enable register)指定哪些中斷或異常發(fā)生后處理器直接進(jìn)入調(diào)試狀態(tài),而操作系統(tǒng)處理程序。進(jìn)入調(diào)試狀態(tài)后,內(nèi)嵌調(diào)試模塊向外部調(diào)試通信接口發(fā)出信號(hào),通知一直通信接口監(jiān)聽主機(jī)調(diào)試器,然后調(diào)試器便可調(diào)試模塊使處理器執(zhí)行系統(tǒng)指令(相當(dāng)于特權(quán)態(tài))。專用片級(jí)調(diào)試接口裝置(BDI2000)支持,不需要目標(biāo)端配備相應(yīng)調(diào)試代理(Monitor)軟件。
1.3 調(diào)試模式引導(dǎo)代碼實(shí)現(xiàn)
調(diào)試模式引導(dǎo)代碼核心使用BDM協(xié)議解析微指令,調(diào)試接口向MPC860發(fā)送信號(hào),初始化調(diào)試環(huán)境。MPC860采用RISC結(jié)構(gòu),初始化部分主設(shè)置處理器內(nèi)部寄存器,這個(gè)過程包括三方面內(nèi)容:
(1)對(duì)處理器相關(guān)寄存器進(jìn)行初始化:主處理器狀態(tài)寄存器(MSR、SRR1、SIUMCR等),中斷、時(shí)鐘相關(guān)模塊(SYPCR、SCCR、PLPRCR、TBSCR等)。
(2)對(duì)BDM調(diào)試端口初始化:包括調(diào)試使能寄存器DER、支持指令斷點(diǎn)寄存器ICTRL等。
(3)對(duì)片級(jí)、板級(jí)內(nèi)存映射初始化:包括內(nèi)部內(nèi)存映射寄存器IMMR,內(nèi)存控制相關(guān)寄存器OR0~0R7、BR0~BR7等。它們主要功能是址映射、片選信號(hào)選擇、內(nèi)存控制器選擇(UMPA、UMPB、GPCM)。選擇UPM,UPM控制采用微指令方式,而這些微指令內(nèi)存不同(SRAM、SDRAM、DRAM等),需要設(shè)計(jì)人員自行編寫代碼寫入MPC860內(nèi)部存儲(chǔ)區(qū)相應(yīng)位置。需要實(shí)時(shí)刷新存儲(chǔ)體(如SDRAM),還需設(shè)置刷新控制微指令。
上述初始化代碼以執(zhí)行,依賴于目標(biāo)機(jī)MPC860提供調(diào)試接口支持,另也需要宿主機(jī)GDB支持。宿主機(jī)系統(tǒng),可能選擇Linux,其下配置GBD;也可以選擇Windows2000,使用可視化調(diào)試工具LambdaTools GDB(Coretek公司產(chǎn)品,不支持硬件斷點(diǎn)),使用BDI2000(支持硬件斷點(diǎn)仿真器)。使用哪種調(diào)試工具,都可以使用該調(diào)試器能夠識(shí)別腳本文伯存放初始化指令。這些腳本功能上是等效,指令描述一般都采用如下格式:
操作碼 寄存器 數(shù)值
如嵌入式Linux下SDRAM初始化代碼片斷為:
mpcbdm spr MDR=0x1FF77C35
mpcbdm spr MDR=0xEFEABC34
mpcbdm spr MDR=0x1FB57C35
……
而Windows2000下使用BDI2000代碼為:
WUPM 0x00000005 0x1FF77C35
WUPM 0x00000006 0xEFEABC34
WUPM 0x00000007 0x1FB57C35
……
腳本描述指令執(zhí)行后,MPC860預(yù)先設(shè)想進(jìn)入一個(gè)可以正常工作狀態(tài),可以用裝載器將程序下載到SDRAM中調(diào)試執(zhí)行。這個(gè)程序主要包含中斷表、操作系統(tǒng)和應(yīng)用程序映象兩部分,其格式可以為bin、elf、coff等。圖1給出了下載完畢后內(nèi)存映象。
當(dāng)程序下載完成后,PC指針指向Image代碼段(text段)首條指令,可以利用調(diào)試器提供命令開始調(diào)試。
2 固化模式系統(tǒng)引導(dǎo)
2.1 概述
調(diào)試后,OS和上層應(yīng)用程序構(gòu)成Image正確性到了保證,這個(gè)Image不能自主運(yùn)行。調(diào)試模式下,是BDM接口初始化處理器,BDM接口將程序下載到RAM中去運(yùn)行。實(shí)際應(yīng)用環(huán)境中,Image必須被存儲(chǔ)非易失性存儲(chǔ)器中,如Flash、EPROM等,本文選擇Flash。系統(tǒng)啟動(dòng)時(shí),處理器執(zhí)行一段引導(dǎo)程序替代調(diào)試模式下調(diào)試腳本和裝載程序功能。啟動(dòng)代碼主要考慮以下幾個(gè)問題:
(1)系統(tǒng)上電和復(fù)位時(shí)程序如何執(zhí)行,需要初始化哪些寄存器,重點(diǎn)仍然是內(nèi)存映射相關(guān)部分;
(2)啟動(dòng)代碼為幾部分,每部分代碼應(yīng)該全部部分放到FlashRAM中執(zhí)行;
(3)時(shí)間效率和空間效率折衷。
2.2 上電初始化
兩種引導(dǎo)模式下,上電初始化總是必要步驟。它涉及各種核心寄存器初始化、址映射等問題處理。
2.2.1 址映射
MPC860復(fù)位是一種異常中斷來處理(可理解為CPU自己產(chǎn)生中斷),向量號(hào)為0x100。異常向量表基址加上復(fù)位向量號(hào)即為復(fù)位向量,也就是CPU開始執(zhí)行指令方。異常向量表內(nèi)存空間可能位置有兩個(gè):0x0000000和0xFFF00000。PowerPC復(fù)位向量為0x100或0xFFF00100。復(fù)位向量為0xFFF00100,系統(tǒng)有128K字節(jié)Flash,并準(zhǔn)備把它映射到CPU內(nèi)存空間0xFE000000開始址。MPC860內(nèi)部CS0片選信號(hào)是默認(rèn)系統(tǒng)啟動(dòng)片選信號(hào),已被連接到Flash片選線上。上電時(shí),內(nèi)存控制器會(huì)忽略所有參與征選邏輯址線高17位,CS0總是有效。這樣,F(xiàn)lash總會(huì)被選中,CPU從Flash偏移0x100方取指令,此時(shí)CPU4GB內(nèi)存空間每個(gè)128KB塊都被映射到Flash。
2.2.2 寄存器初始化
固化方式下大致相同,不再采用腳本文件編寫,直接將一段MPC860匯編程序存放一個(gè)start.s文件中。與調(diào)試模式初始化程序一樣,主要完成以下處理:
(1)初始化CPU核心寄存器;
(2)設(shè)置機(jī)器狀態(tài)寄存器;
(3)禁止ceche;
(4)初始化IMMR;
(5)初始化系統(tǒng)接口單元(SIU);
(6)初始化時(shí)鐘和中斷控制寄存器;
(7)初始化通信處理機(jī)(CPM);
(8)初始化內(nèi)存控制器(UPM);
(9)初始化C語言堆棧。
2.2.3 址空間重映射
上電時(shí),一個(gè)片選信號(hào)有效,它選通了Flash,而RAM和其它存儲(chǔ)設(shè)備址無效,需要址空間重映射才能訪問。MPC860址空間重映射是設(shè)置0R0~OR7、BR0~BR7這十六個(gè)寄存器完成。上電時(shí)4GB址空間均被Flash占用,0xFFF00100這個(gè)址仍Flash偏移0x100處。寄存器初始化過程中,需要把SDRAM、MPC860內(nèi)部寄存器空間以及外設(shè)等也映射進(jìn)來。進(jìn)行這些操作前,需要把Flash位置固定下來,例如映射到0xFE000000,這個(gè)操作是設(shè)置OR0和BR0寄存器實(shí)現(xiàn)。但寫OR0時(shí),CPU仍然0xFFF00000那一塊取指令,而Flash即將被映射到0xFE000000塊,程序必定出現(xiàn)“跑飛”現(xiàn)象,必須對(duì)程序計(jì)數(shù)器(PC)進(jìn)行調(diào)整,PC指針對(duì)程序員是不可見,必須用跳轉(zhuǎn)指令修改它。Flash址映射完成后,設(shè)置OR1~OR7、BR1~BR7可以完成對(duì)所有存儲(chǔ)器空間映射,各種存儲(chǔ)設(shè)備可映射CPU址空間中任意位置,但相互之間不能沖突。
2.3 引導(dǎo)代碼構(gòu)成和運(yùn)行
系統(tǒng)啟動(dòng)所涉及代碼由寄存器初始化匯編文件start.s、一個(gè)Load程序以及操作系統(tǒng)與應(yīng)用程序Image三部分構(gòu)成,引導(dǎo)代碼則只包含start.s和Load程序。Load程序作用是將操作系統(tǒng)與應(yīng)用程序構(gòu)成Image從Flash拷貝到SDRAM中,并跳轉(zhuǎn)到Image首條指令。
調(diào)試完成后Image有兩種運(yùn)行模式:
Flash-resident image:Load程序僅僅 把Image中數(shù)據(jù)段(data+bss)復(fù)制到RAM中,代碼段(text)Flash中直接運(yùn)行。
Flash-based image:Load程序把Image完全搬到RAM中執(zhí)行,包括image中代碼段(text)和數(shù)據(jù)段(data+bss)。
圖2和圖3分別描述了兩種Image存貯映象,以及從Flash到SDRAM裝載過程。
2.4 時(shí)間效率和空間效率上折衷
嵌入式系統(tǒng)應(yīng)用過程中,針對(duì)不同應(yīng)用環(huán)境,對(duì)時(shí)間效率和空間效率有不同要求,基于MPC860啟動(dòng)代碼對(duì)此有比較充分解決方案。
2.4.1 時(shí)間限制
時(shí)間限制主要包括兩種情況:系統(tǒng)要求快速啟動(dòng)和系統(tǒng)啟動(dòng)后要求程序高速執(zhí)行。
要求快速啟動(dòng)系統(tǒng),應(yīng)該使Flash中執(zhí)行初始化程序盡量簡短,諸如循環(huán)語句之類語法應(yīng)該盡量減少,盡快將程序裝載到RAM中執(zhí)行,這樣做原因Flash訪存時(shí)間與RAM訪存時(shí)間存數(shù)量級(jí)上差距。必須代碼量以及存儲(chǔ)器特片進(jìn)行權(quán)衡。,RAM中捃速度快,將Flash中代碼復(fù)制到RAM中操作會(huì)帶來一定開銷?梢,啟動(dòng)時(shí)間由Flash中引導(dǎo)代碼運(yùn)行時(shí)間、代碼從Flash拷貝到RAM時(shí)間以及RAM中后續(xù)啟動(dòng)代碼運(yùn)行時(shí)間三部分組成。啟動(dòng)時(shí)間最小值是這三者和最小值。
啟動(dòng)后要求程序高速執(zhí)行系統(tǒng),主要受處理器、存儲(chǔ)器特性以及I/O速度等影響。軟件方面,應(yīng)該采用了上述Flash-based image方式,使代碼段RAM中運(yùn)行,提高運(yùn)行速度。
2.4.2 空間限制
空間限制主要包括兩種情況:Flash等非易失性存儲(chǔ)空間有限和RAM等易失性空間有限兩種系統(tǒng)。
采用高性能非易失性存儲(chǔ)器系統(tǒng),出于成本因素,F(xiàn)lash等存儲(chǔ)設(shè)備不能太大,它又是系統(tǒng)存放啟動(dòng)代碼和操作系統(tǒng)Image方。存放Image時(shí),可以先使用gzip等壓縮工具進(jìn)行壓縮,將Image加載到RAM時(shí)采用逆向解壓縮算法解壓。同時(shí),出于實(shí)時(shí)性考慮,壓縮算法不能過于復(fù)雜,否則壓縮解壓過程消耗大量時(shí)間將與啟動(dòng)時(shí)間限制發(fā)生嚴(yán)重沖突。采用壓縮策略并不一定會(huì)增加系統(tǒng)啟動(dòng)時(shí)間,壓縮解壓過程消息了一定時(shí)間,Image體積減小,由Flash復(fù)制到RAM中時(shí)間相應(yīng)減少,有可能減少了時(shí)間消耗。
采用高性能RAM系統(tǒng),同樣出于成本因素,RAM空間有一定限制,此時(shí)一般采用前文描述Flashresident image方式:Load程序把Image中數(shù)據(jù)段復(fù)制到RAM中,代碼段Flash中運(yùn)行。折衷同樣存,code段低速Flash中運(yùn)行,節(jié)省空間同時(shí),卻犧牲了時(shí)間。
本文介紹了基于嵌入式處理器操作系統(tǒng)引導(dǎo)方法,重點(diǎn)研究嵌入式系統(tǒng)引導(dǎo)模式以及不同類別引導(dǎo)方法。以MPC860C處理器上引導(dǎo)CRTOSII操作系統(tǒng)為例,闡述了調(diào)試模式和固化模式下引導(dǎo)代碼構(gòu)成、作及執(zhí)行方式,并對(duì)不同引導(dǎo)模式下時(shí)空效率折衷進(jìn)行了分析。最終,借助BDI2000仿真器對(duì)編寫引導(dǎo)代碼進(jìn)行調(diào)試,成功實(shí)現(xiàn)了調(diào)試模式和固化模式下操作系統(tǒng)引導(dǎo)。后續(xù)工作包括:繼續(xù)研究不同硬件平臺(tái)上操作系統(tǒng)引導(dǎo)方法,例如最流行ARM、X86系列;同一平臺(tái)上,可以研究不同操作系統(tǒng)啟動(dòng)方法,例如嵌入式Linux、Vxworks、WinCE等。同時(shí),可以引入數(shù)字模型對(duì)時(shí)間、空間性能進(jìn)行量化分析,不同環(huán)境下采取比較合適引導(dǎo)方案。
共0條 [查看全部] 網(wǎng)友評(píng)論