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