什麼是WinCE作業系統移植?
(1)為什麼要進行作業系統移植?
目前嵌入式系統應用變得越來越廣泛了,嵌入式產品充斥著許多領域,如日常生活的手機、MP4、PDA等都屬於典型的嵌入式系統。隨著技術和消費者需求的變化,即使是同一類型的嵌入式產品也會存在著硬體平台的變化,或會存在著軟體平台的更新換代。因此,為了更快的適應市場需求,在實際開發過程更傾向於移植作業系統而不是重新開發作業系統。這樣不但可以節省時間,還能大大提高開發效率。
由於嵌入式系統是一個軟硬體緊密結合的系統,因此作業系統移植包含兩個層面上的工作:一個層面是CPU級的,另一個層面是板級的。由於WinCE作業系統幾乎完全是用C語言編寫的,所以可移植到眾多的32位微處理器上。這其中包括ARM、x86、MIPS和SHx等,而且CPU級的移植通常由微軟或晶片製造商來完成,這會極大地減輕0EM廠商開發過程中移植作業系統的工作量,但板級層面的移植則還是需要由OEM廠商來完成的。
一般來說,一個WinCE系統包括四層結構:應用程式、WinCE核心映像、板級支援包(BSP)、硬體平台。而基本軟體平台則主要由WinCE系統核心映像(OS Image)和板卡支援包(BSP)兩部分組成。因為WinCE系統是一個軟硬體緊密結合的系統,因此即使CPU處理器相同,但是如果開發板上的外圍硬體不相同,這個時候還是需要修改BSP來完成一個新的BSP。因此換句話說,就是WinCE的移植過程主要是改寫BSP的過程。
(2)什麼是板級BSP移植?
一般來說,從零開始開發和定製WinCE BSP是需要相當長的時間,BSP的定製開發在整個嵌入式產品開發時間上佔了很大比例。所以,快速的BSP移植是適應激烈競爭的市場環境的一個捷徑。BSP(Board Support Packet——板級支援包)是介於底層硬體和上層軟體之間的底層軟體開發包,它主要的功能是給上層提供統一介面,同時屏蔽各種硬體底層的差異,以及提供作業系統的驅動及硬體驅動。簡單的說,就是BSP包含了所有與硬體有關的代碼,為作業系統提供了硬體平台無關性。因此,通過BSP系統,就能將CPU的硬體系統與Windows CE的軟體系統聯絡為一個整體。
從WinCE開發文檔中我們可知,BSP是一個包括啟動程式Bootloader、OEM適配層程式(OAL)、標準開發板(SDB)和相關硬體裝置的驅動程式和設定檔的軟體包。其中Bootloader是加電即啟動並執行一段程式,它能初始化硬體,建立系統的記憶體空間映射,為最終調用系統核心做準備。主要用於下載和啟動鏡像nk.bin。而OAL則是邏輯上駐留在Windows CE核心與目標裝置之間的代碼層,OEM廠商使用這些代碼把WinCE適配到自己的硬體上;在物理上OAL是與核心庫串連在一起產生核心可執行檔。OAL簡化了作業系統與目標代碼之間的通訊,OAL代碼用來處理中斷、記時器、電源管理、通用I/O控制等。最後,裝置驅動程式是指本機驅動程式以及流介面驅動程式。本機驅動程式有GEWS.exe載入的滑鼠、鍵盤、觸控螢幕、顯示驅動等;而流介面驅動程式使用一組流函數來實現,通常由Device.exe載入,如網卡、音效卡、USB等。
WinCE BSP移植的流程和步驟
從前文分析我們可以知道,WinCE系統移植的重點是BSP 的移植。而BSP移植主要包括啟動程式Bootloader、OEM適配層程式OAL、標準開發板(SDB)本地驅動程式以及一些檔案配置的修改。以下是WinCE BSP移植的主要內容和流程步驟:
(1)啟動程式Bootloader的移植步驟
修改Bootloader是移植Win CE系統第一步,也是關鍵的一步。只有得到一個穩定工作的啟動程式,才能夠進一步完成WinCE BSP的移植。Bootloader主要用來管理目標平台的啟動過程,它是一段單獨的程式碼,通過這段小程式可以初始化硬體裝置、建立記憶體空間的映射圖和下載作業系統的映像檔案等,從而將系統的軟硬體環境帶到一個合適的狀態,它一般存放於目標平台的非易失儲存介質中,如ROM或Flash。
一般來說,對於Bootloader的功能,不同的場合區別很大。比如,在案頭Windows版的PC硬體平台上,由於硬體啟動根本就不通過Bootloader(而是通過BIOS),所以Bootloader就無需對CPU加電後的初始化做任何工作;而在嵌入式WinCE平台上,Bootloader是最先被執行的程式,所以就必須包括加電初始化程式,同時通常Bootloader必須包含下載WinCE映像文檔的功能。由於Bootloader會涉及到基本的硬體操作,如CPU的結構、指令等,也會又涉及到乙太網路下載協議和映像文檔格式。因此,從零開發實現的話會需要相當長的過程,通常的做法是利用微軟為每種類型的CPU提供的某種標準研發板的Bootloader常式。
根據我在這次項目移植得到的經驗,Bootloader的移植步驟主要是:①是修改相應的dir、source檔案;②是修改makefile.inc;③是修改boot.bib,使其不與config.bib中的記憶體配置造成衝突;④是改進eboot,因為eboot燒寫NK.BIN的時候會尋找BINFS分區,然後把下載的image燒寫到BINFS分區。
(2)OAL的移植步驟
OAL的全稱是OEM Adaption Layer,即原始裝置製造商適配層。它是位於Windows CE核心和目標硬體平台之間的一個代碼層,OAL主要負責Windows CE與硬體通訊,它與CPU、中斷、記憶體、時鐘和調試口等核心裝置相關,也是OAL各個模組代碼被編譯後(.lib)和其它核心庫連結到一起形成Windows CE的核心可執行文檔NK.EXE的關鍵。簡單的說,OAL就是用來屏蔽CPU平台的細節和抽象硬體功能,以實現作業系統核心的可移植性。
從邏輯結構上看,OAL位於WinCE作業系統的核心與硬體之間,是串連WinCE系統與硬體的樞紐;從功能上看,OAL頗似案頭PC上的BIOS,具有初始化裝置、引導作業系統以及抽象硬體功能等作用。但與B10S不同的是,0AL隸屬於作業系統,是作業系統的一部分。
從我在這次項目中得到的經驗來看,Windows CE安裝目錄的子目錄中都包含有OAL的部分源碼。OAL的移植實現應是在fwxsc1.s、main.c、Flash.c、Edeviceinit.c等檔案中,可根據實際需要修改相應的代碼。在OAL移植過程中,主要是修改這幾個函數:修改Startup.s函數、修改串口調試函數、修改OEMInit函數、修改系統時鐘函數和修改中斷處理函數等。實際上,大多數情況下開發工程師對OAL只要修改即可,甚至無需修改。
(3)驅動程式的移植和開發
驅動程式(Device Drivers)是指能夠管理虛擬或者物理裝置、協議、服務等的一段軟體模組,作業系統是通過驅動程式直接和硬體打交道的。裝置驅動程式能為WinCE提供裝置控制功能,包括:LCD/LED/VGA/SVGA顯示裝置、滑鼠、鍵盤和觸控螢幕等。根據我在這次項目移植得到的經驗,建議裝置驅動程式的移植可通過Platform. Builder建立一個新的平台,然後再根據硬體平台的需要插入和移除驅動。一般來說,需要修改的檔案有Platform. Bib、Platform. reg及驅動程式原始碼等。
(4)平台檔案配置的修改
平台設定檔包括程式碼設定檔案和作業系統鏡像設定檔。程式碼設定檔案主要是告訴Build工具需要用到的路徑,包括Dirs檔案、Sources檔案和Makefile檔案等。作業系統鏡像設定檔則主要用於給Makeimag工具產生作業系統鏡像,包括.bib、.reg、.dat、.db等檔案。因此,在進行BSP移植的時候,也需要對這些平台設定檔進行適當的修改和變更。
(5)移植時需特別注意的地方
很多嵌入式開發實踐都證明BSP移植是一個挺複雜、煩瑣的過程。因為WinCE 不同版本的BSP包的組織圖是不同的,所以會導致很多連結庫無法找到或者是這些庫已經被替換、刪除,唯一的方法是只有耐心的根據錯誤提示來一一定位修改。
例如,在移植Bootloader時因為Bootloader的下載、燒寫、啟動鏡像過程會涉及到記憶體位址,所以在處理各種入口地址時應該要避免出現差錯或記憶體超出範圍,尤其是處理地址衝突時需要特別小心。還有在移植OAL時,startup.s以及OEMInitDebugSerial兩個函數需要特別注意,因為它們主要是初始化硬體及串口,系統運行及驅動調試的基礎,如果硬體設定以及調試串口有改變,則需要適當的修改。
轉載自(ITPUB潘八妹):http://space.itpub.net/12325938/viewspace-607336