摘 要: 以PowerPC8xx系列處理器為例,,通過(guò)對(duì)此類處理器的引導(dǎo)模式、引導(dǎo)代碼" title="引導(dǎo)代碼">引導(dǎo)代碼的編寫(xiě)和調(diào)試,,以及如何引導(dǎo)操作系統(tǒng)執(zhí)行等問(wèn)題的研究,,探索嵌入式系統(tǒng)" title="嵌入式系統(tǒng)">嵌入式系統(tǒng)引導(dǎo)過(guò)程的一種解決方案。
關(guān)鍵詞: MPC860 嵌入式操作系統(tǒng) 存儲(chǔ)映射 引導(dǎo)
嵌入式系統(tǒng)應(yīng)用開(kāi)發(fā)不同于PC機(jī),,其開(kāi)發(fā)過(guò)程同時(shí)涉及軟硬件,,需要將硬件平臺(tái)的設(shè)計(jì),、操作系統(tǒng)以及上層應(yīng)用開(kāi)發(fā)綜合考慮;而PC機(jī)應(yīng)用開(kāi)發(fā)建立在已經(jīng)定制好的硬件和操作系統(tǒng)平臺(tái)上,,開(kāi)發(fā)者只需調(diào)用系統(tǒng)提供的接口和服務(wù)完成相應(yīng)的功能,。由于應(yīng)用和成本約束,嵌入式系統(tǒng)的硬件平臺(tái)需根據(jù)應(yīng)用量身定制,,通常所用的MPU,、存儲(chǔ)器、外圍設(shè)備等有多種選擇余地,,而且軟件調(diào)試技術(shù)特殊,,使平臺(tái)的引導(dǎo)設(shè)計(jì)變得十分復(fù)雜。因此,,對(duì)于嵌入式系統(tǒng)開(kāi)發(fā)者而言,,有必要深入分析系統(tǒng)引導(dǎo)過(guò)程,將軟硬件開(kāi)發(fā)有效地結(jié)合,,即針對(duì)不同的硬件平臺(tái)和軟件運(yùn)行模式,,正確地進(jìn)行底層上電" title="上電">上電初始化,進(jìn)而引導(dǎo)操作系統(tǒng)執(zhí)行,。這個(gè)問(wèn)題的核心在于對(duì)系統(tǒng)的引導(dǎo)模式的研究,。
嵌入式系統(tǒng)的啟動(dòng)代碼" title="啟動(dòng)代碼">啟動(dòng)代碼一般由兩部分構(gòu)成:引導(dǎo)代碼和操作系統(tǒng)執(zhí)行環(huán)境的初始化代碼。其中引導(dǎo)代碼一般也由兩部分構(gòu)成:第一部分是板級(jí),、片級(jí)初始化代碼,,主要功能是通過(guò)設(shè)置寄存器初始化硬件的工作方式,如設(shè)置時(shí)鐘,、中斷控制寄存器等,,完成內(nèi)存映射、初始化MMU等,;第二部分是裝載程序,,其功能是將操作系統(tǒng)和應(yīng)用程序" title="應(yī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ù),。嵌入式軟件的開(kāi)發(fā)涉及調(diào)試模式和固化模式兩種運(yùn)行狀態(tài)。調(diào)試模式主要解決如何在目標(biāo)板上調(diào)試正確性未經(jīng)驗(yàn)證的程序的問(wèn)題,;而固化模式主要解決如何引導(dǎo)已調(diào)試成功的程序的問(wèn)題,。相應(yīng)地,引導(dǎo)代碼的設(shè)計(jì)應(yīng)針對(duì)兩種模式分別進(jìn)行。
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)代碼是本研究中力求解決的問(wèn)題。事實(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)用程序代碼的正確性通過(guò)一次的編寫(xiě)不能得到保證,,需要經(jīng)歷“調(diào)試——修改——調(diào)試”反復(fù)的過(guò)程,因此需要建立一個(gè)可靠的調(diào)試環(huán)境,。該環(huán)境建立的基礎(chǔ)正是調(diào)試模式下的引導(dǎo)代碼,。
1.2 引導(dǎo)代碼的調(diào)試方法
本研究實(shí)例采用一種稱作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)試模塊接管中斷及異常處理,,用戶通過(guò)設(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)聽(tīng)的主機(jī)調(diào)試器,,然后調(diào)試器便可通過(guò)調(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é)議解析微指令,,通過(guò)調(diào)試接口向MPC860發(fā)送信號(hào),初始化調(diào)試環(huán)境,。由于MPC860采用RISC結(jié)構(gòu),,所以初始化部分主要是設(shè)置處理器內(nèi)部寄存器,這個(gè)過(guò)程包括三方面內(nèi)容:
(1)對(duì)處理器相關(guān)寄存器進(jìn)行初始化:主要是關(guā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)部?jī)?nèi)存映射寄存器IMMR,內(nèi)存控制相關(guān)寄存器OR0~0R7,、BR0~BR7等,。它們主要功能是地址映射、片選信號(hào)選擇,、內(nèi)存控制器選擇(UMPA,、UMPB、GPCM),。如果選擇UPM,,由于UPM控制采用微指令方式,而這些微指令根據(jù)內(nèi)存的不同(SRAM,、SDRAM,、DRAM等),需要設(shè)計(jì)人員自行編寫(xiě)代碼寫(xiě)入MPC860內(nèi)部存儲(chǔ)區(qū)相應(yīng)位置。對(duì)于需要實(shí)時(shí)刷新的存儲(chǔ)體(如SDRAM),,還需設(shè)置刷新控制微指令,。
上述初始化代碼得以執(zhí)行,一方面依賴于目標(biāo)機(jī)MPC860提供的調(diào)試接口支持,,另一方面也需要宿主機(jī)GDB的支持,。對(duì)于宿主機(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)試器提供的命令開(kāi)始調(diào)試,。
2 固化模式的系統(tǒng)引導(dǎo)
2.1概述
經(jīng)過(guò)調(diào)試后,OS 和上層應(yīng)用程序構(gòu)成的Image的正確性得到了保證,,但是這個(gè)Image不能自主運(yùn)行,。因?yàn)檎{(diào)試模式下,是通過(guò)BDM接口初始化處理器,,并且通過(guò)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è)問(wèn)題:
(1)系統(tǒng)上電和復(fù)位時(shí)程序如何執(zhí)行,,需要初始化哪些寄存器,,重點(diǎn)仍然是內(nèi)存映射相關(guān)部分;
(2)啟動(dòng)代碼分為幾部分,,每部分代碼應(yīng)該全部還是部分放到Flash或者RAM中執(zhí)行,;
(3)在時(shí)間效率和空間效率的折衷。
2.2 上電初始化
在兩種引導(dǎo)模式下,,上電初始化總是必要步驟,。它涉及各種核心寄存器初始化,、地址映射等問(wèn)題的處理。
2.2.1 地址映射
MPC860的復(fù)位是通過(guò)一種異常中斷來(lái)處理的(可理解為CPU自己產(chǎn)生的中斷),,向量號(hào)為0x100,。異常向量表的基地址加上復(fù)位向量號(hào)即為復(fù)位向量,也就是CPU開(kāi)始執(zhí)行指令的地方,。異常向量表在內(nèi)存空間的可能位置有兩個(gè):0x00000000和0xFFF00000。所以PowerPC的復(fù)位向量為0x100或0xFFF00100,。假設(shè)復(fù)位向量為0xFFF00100,,系統(tǒng)有128K字節(jié)的Flash,并準(zhǔn)備把它映射到CPU內(nèi)存空間0xFE000000開(kāi)始的地方,。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í)CPU的4GB內(nèi)存空間的每個(gè)128KB的塊都被映射到Flash,。
2.2.2 寄存器初始化
固化方式下的寄存器初始化與調(diào)試模式下大致相同,,但是不再采用腳本文件編寫(xiě),而是直接將一段MPC860匯編程序存放在一個(gè)start.s文件中,。與調(diào)試模式初始化程序一樣,,主要完成以下處理:
(1)初始化CPU核心寄存器;
(2)設(shè)置機(jī)器狀態(tài)寄存器,;
(3)禁止cache,;
(4)初始化IMMR;
(5)初始化系統(tǒng)接口單元(SIU),;
(6)初始化時(shí)鐘和中斷控制寄存器,;
(7)初始化通信處理機(jī)(CPM);
(8)初始化內(nèi)存控制器(UPM),;
(9)初始化C語(yǔ)言堆棧,。
2.2.3 地址空間重映射
上電時(shí),由于只有一個(gè)片選信號(hào)有效,,它選通了Flash,,而RAM和其它存儲(chǔ)設(shè)備地址無(wú)效,需要經(jīng)過(guò)地址空間重映射才能訪問(wèn),。MPC860的地址空間重映射是通過(guò)設(shè)置0R0~OR7,、BR0~BR7這十六個(gè)寄存器完成的,。由于上電時(shí)4GB的地址空間均被Flash占用,所以0xFFF00100這個(gè)地址仍在Flash的偏移0x100處,。在寄存器初始化過(guò)程中,,需要把SDRAM、MPC860內(nèi)部存儲(chǔ)空間以及外設(shè)等也映射進(jìn)來(lái),。在進(jìn)行這些操作前,,需要把Flash的位置固定下來(lái),例如映射到0xFE000000,,這個(gè)操作是通過(guò)設(shè)置OR0和BR0寄存器實(shí)現(xiàn)的,。但在寫(xiě)OR0時(shí),CPU仍然在0xFFF00000的那一塊取指令,,而Flash即將被映射到0xFE000000塊,,所以程序必定出現(xiàn)“跑飛”的現(xiàn)象,必須對(duì)程序計(jì)數(shù)器(PC)進(jìn)行調(diào)整,,然而PC指針對(duì)程序員是不可見(jiàn)的,,必須用跳轉(zhuǎn)指令修改它。在Flash地址映射完成后,,通過(guò)設(shè)置0R1~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的裝載過(guò)程。
2.4 時(shí)間效率和空間效率上的折衷
在嵌入式系統(tǒng)的應(yīng)用過(guò)程中,,針對(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í)行,。
對(duì)于要求快速啟動(dòng)的系統(tǒng),應(yīng)該使在Flash中執(zhí)行的初始化程序盡量簡(jiǎn)短,,諸如循環(huán)語(yǔ)句之類的語(yǔ)法應(yīng)該盡量減少,,盡快將程序裝載到RAM中執(zhí)行,,這樣做的原因在于Flash的訪存時(shí)間與RAM的訪存時(shí)間存在數(shù)量級(jí)上的差距。但是必須根據(jù)代碼量以及存儲(chǔ)器的特性進(jìn)行權(quán)衡,。因?yàn)?,雖然RAM中執(zhí)行速度快,但是將Flash中的代碼復(fù)制到RAM中的操作會(huì)帶來(lái)一定的開(kāi)銷,。由此可見(jiàn),,啟動(dòng)時(shí)間由Flash中引導(dǎo)代碼的運(yùn)行時(shí)間、代碼從Flash拷貝到RAM的時(shí)間以及RAM中后續(xù)啟動(dòng)代碼的運(yùn)行時(shí)間三部分組成,。啟動(dòng)時(shí)間的最小值是這三者和的最小值,。
對(duì)于啟動(dòng)后要求程序高速執(zhí)行的系統(tǒng),主要受處理器,、存儲(chǔ)器特性以及I/0速度等的影響。在軟件方面,,應(yīng)該采用上述Flash-based image方式,,使得代碼段在RAM中運(yùn)行,提高運(yùn)行速度,。
2.4.2 空間限制
空間限制主要包括兩種情況:Flash等非易失性存儲(chǔ)空間有限和RAM等易失性空間有限兩種系統(tǒng),。
對(duì)于采用高性能非易失性存儲(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í)性考慮,,壓縮算法不能過(guò)于復(fù)雜,否則壓縮解壓過(guò)程消耗大量時(shí)間將與啟動(dòng)時(shí)間限制發(fā)生嚴(yán)重沖突,。采用壓縮策略并不一定會(huì)增加系統(tǒng)啟動(dòng)時(shí)間,,因?yàn)閴嚎s解壓過(guò)程雖然消耗了一定的時(shí)間,但是由于Image體積減小,,由Flash復(fù)制到RAM中的時(shí)間相應(yīng)減少,,有可能反而減少了時(shí)間消耗。
對(duì)于采用高性能RAM的系統(tǒng),,同樣出于成本因素,,RAM空間有一定限制,此時(shí)一般采用前文描述的Flash-resident image方式:Load程序把Image中的數(shù)據(jù)段復(fù)制到RAM中,,代碼段在Flash中運(yùn)行,。折衷同樣存在,,因?yàn)閏ode段在低速的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ì)編寫(xiě)的引導(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ù)學(xué)模型對(duì)時(shí)間,、空間性能進(jìn)行量化分析,以便在不同環(huán)境下采取比較合適的引導(dǎo)方案,。
參考文獻(xiàn)
1 Thomas E. Besemer.The Motorola MPC8xx Family Designers Handbook
2 MPC860 PowerQUICC Family User’s Manual 3/2003 REV
3 RTEMS PowerPC Applications Supplement Edition ss-20030411, for RTEMS ss-20030411. 27 January 2003
4 張曉林.嵌入式系統(tǒng)固件揭密.北京:電子工業(yè)出版社,,2003.6
5 王安生. 嵌入式系統(tǒng)的實(shí)時(shí)概念.北京:北京航空航天大學(xué)出版社,2004.6
6 胡永慶, 田日才. 閃速存儲(chǔ)器硬件接口和程序設(shè)計(jì)中的關(guān)鍵技術(shù). 電子技術(shù)應(yīng)用,,2001,;27(11)