摘 要: 創(chuàng)建和定制Windows CE .net嵌入式操作系統(tǒng)的方法。此方法對(duì)于Windows CE嵌入式平臺(tái)的研究、開(kāi)發(fā)和定制具有良好的借鑒作用。
關(guān)鍵詞: Windows CE 嵌入式操作系統(tǒng) 定制 裁剪
Microsoft Windows CE .net是Windows CE 3.0的后續(xù)產(chǎn)品,它不僅是一個(gè)功能強(qiáng)大的實(shí)時(shí)嵌入式操作系統(tǒng),而且提供了眾多開(kāi)發(fā)調(diào)試工具,允許用戶(hù)利用它快速開(kāi)發(fā)新一代的智能化設(shè)備。借助于完善的操作系統(tǒng)功能和開(kāi)發(fā)工具,Windows CE .net為開(kāi)發(fā)人員提供了構(gòu)建、調(diào)試和部署基于Windows CE .net定制設(shè)備所需的一切特性。平臺(tái)開(kāi)發(fā)工具Platform Builder是一個(gè)完全集成的開(kāi)發(fā)環(huán)境(IDE),并且包括一個(gè)軟件開(kāi)發(fā)工具包(SDK)導(dǎo)出工具。
平臺(tái)向?qū)?Platform Wizard)允許開(kāi)發(fā)人員根據(jù)將要?jiǎng)?chuàng)建設(shè)備的類(lèi)型簡(jiǎn)便快捷地建立新的平臺(tái)。該向?qū)峁┝?2個(gè)預(yù)建配置,以便為設(shè)備設(shè)計(jì)提供一個(gè)基礎(chǔ)。這些設(shè)備包括:數(shù)字媒體接收設(shè)備、企業(yè)終端、企業(yè)Web Pad、網(wǎng)關(guān)、工業(yè)控制設(shè)備、Internet設(shè)備、IP電話、移動(dòng)手持設(shè)備、移動(dòng)電話、機(jī)頂盒、微內(nèi)核、Windows瘦客戶(hù)機(jī)。
由于微軟對(duì)嵌入式操作系統(tǒng)研發(fā)力量的增強(qiáng),CE的優(yōu)勢(shì)越來(lái)越明顯:實(shí)時(shí)處理能力不斷增強(qiáng)(在使用Pentium 166 MHz處理器時(shí),ISR延遲平均為2.8ms,IST延遲平均為17.9ms)、強(qiáng)大的多媒體能力、可伸縮的無(wú)線技術(shù)支持、針對(duì)小內(nèi)存體積占用進(jìn)行優(yōu)化(最小200KB)、具有適應(yīng)性的可定制用戶(hù)界面、豐富的設(shè)備驅(qū)動(dòng)程序、強(qiáng)大的應(yīng)用程序開(kāi)發(fā)等。因此,Windows CE在嵌入式系統(tǒng)的市場(chǎng)占有率越來(lái)越高。
1 創(chuàng)建Windows CE .net的主要步驟
創(chuàng)建一個(gè)基于Microsoft Windows CE .net的操作系統(tǒng),必須完成下面幾個(gè)主要步驟:(1)選擇一個(gè)標(biāo)準(zhǔn)的開(kāi)發(fā)版(SDB)作為模板,創(chuàng)建一個(gè)Windows CE的平臺(tái)。(2)使用備選的工程及目錄中列舉的特色,對(duì)平臺(tái)進(jìn)行定制。(3)編譯并Build鏡像文件(image),并將它下載到SDB。采用在Platform Builder集成開(kāi)發(fā)環(huán)境中的Debug工具調(diào)試平臺(tái)。(4)為特定的目標(biāo)設(shè)備創(chuàng)建一個(gè)boot loader以及板支持包(BSP)。(5)用新的BSP重新編譯(Rebuild)操作系統(tǒng)鏡像,并將它下載進(jìn)入目標(biāo)設(shè)備,調(diào)試這個(gè)平臺(tái)。(6)當(dāng)平臺(tái)創(chuàng)建完畢的時(shí)候,輸出軟件開(kāi)發(fā)包(SDK),以便在開(kāi)發(fā)平臺(tái)應(yīng)用程序時(shí)使用。
在一個(gè)典型的平臺(tái)開(kāi)發(fā)方案中,可以首先下載自己的操作系統(tǒng)鏡像到硬件平臺(tái),例如基于PC的Windows CE硬件開(kāi)發(fā)平臺(tái)(CEPC)。Platform Builder包括了boot loaders、CEPC板支持包以及許多別的硬件開(kāi)發(fā)平臺(tái)。在硬件平臺(tái)上精簡(jiǎn)而且調(diào)試好開(kāi)發(fā)平臺(tái)后,就可以將它應(yīng)用于自己的特定目標(biāo)設(shè)備。在下載鏡像到目標(biāo)設(shè)備之前,用戶(hù)必須創(chuàng)建一個(gè)boot loader以及OEM適配層OAL。OAL是指操作系統(tǒng)kernel和目標(biāo)平臺(tái)之間的連接層。一旦完成了平臺(tái)創(chuàng)建,就可以輸出一個(gè)SDK,應(yīng)用程序開(kāi)發(fā)人員可以將此SDK安裝到Microsoft eMbedded Visual C++ 4.0或者M(jìn)icrosoft Visual Studio.Net的Smart Device Extensions等開(kāi)發(fā)系統(tǒng)中,用以編寫(xiě)基于該平臺(tái)的應(yīng)用程序。圖1描述了采用Platform Builder創(chuàng)建一個(gè)基于Windows CE平臺(tái)的過(guò)程。

2 定制適合自己的操作系統(tǒng)
由于微軟提供了良好的平臺(tái)向?qū)?本文不再對(duì)這些過(guò)程進(jìn)行敘述,僅對(duì)創(chuàng)建過(guò)程中的關(guān)鍵問(wèn)題進(jìn)行說(shuō)明。
2.1 自動(dòng)載入應(yīng)用程序
很多設(shè)備需要在操作系統(tǒng)啟動(dòng)時(shí),自動(dòng)載入自己的應(yīng)用程序。有的CE系統(tǒng)本身就沒(méi)有標(biāo)準(zhǔn)的CE界面,更需要自動(dòng)加載自己的應(yīng)用程序作為設(shè)備啟動(dòng)界面。需要在操作系統(tǒng)啟動(dòng)時(shí)加載的文件一般放在注冊(cè)表的鍵[HKEY_LOCAL_MACHINEinit]下面,例如:[HKEY_LOCAL_MACHINEinit]
″Launch50″=″explorer.exe″
″Depend50″=hex:14,00,1e,00
這些文件是系統(tǒng)啟動(dòng)時(shí)運(yùn)行的程序。其中Launch后的數(shù)字越小,運(yùn)行越早;Depend的值說(shuō)明這個(gè)程序要依賴(lài)前面的哪些程序。一般有Launch10 SHELL.EXE、Launch20 DEVICE.EXE、Launch30 GWES.EXE、Launch50 EXPLORER.EXE四個(gè)模塊需要啟動(dòng)。
以上這些模塊都是標(biāo)準(zhǔn)的用戶(hù)級(jí)進(jìn)程,因此可以在這個(gè)階段添加自己的應(yīng)用程序,也可以在DEVICE.EXE之后、GWES.EXE之前啟動(dòng)一個(gè)任意的應(yīng)用程序App.exe。但是該應(yīng)用程序必須沒(méi)有調(diào)用GWES.EXE和EXPLORER.EXE中定義的圖形和Windows資源管理器的功能,否則該應(yīng)用程序不能正常運(yùn)行。EXPLORER.EXE是CE標(biāo)準(zhǔn)的Shell,在其之前和之后啟動(dòng)一個(gè)具有標(biāo)準(zhǔn)用戶(hù)接口的應(yīng)用程序時(shí)都會(huì)出現(xiàn)問(wèn)題。EXPLORER并不能處理在其之前創(chuàng)建的可見(jiàn)的、頂級(jí)的窗口應(yīng)用。由于EXPLORER.EXE裝載之后需要執(zhí)行某些特定的初始化操作,因此在其后隨即啟動(dòng)的帶有用戶(hù)接口的應(yīng)用也不能正常執(zhí)行。但在其之前和之后可以啟動(dòng)沒(méi)有用戶(hù)接口的應(yīng)用程序,例如通信監(jiān)控程序。
EXPLORER.EXE執(zhí)行之后,啟動(dòng)過(guò)程從注冊(cè)表切換到文件系統(tǒng)。在初始化完桌面和任務(wù)欄窗口之后,它會(huì)在目錄windowsstartup中尋找任何可以執(zhí)行的應(yīng)用程序或其快捷方式,因此可以把需要開(kāi)機(jī)啟動(dòng)的應(yīng)用或其快捷方式放在該目錄中。方法如下:
在platform.dat文件中加入以下程序:
Directory(″WindowsStartUp″):-File(″sample.exe″,
″windowssample.exe″)
其中:路徑″WindowsStartUp″代表啟動(dòng)菜單,路徑″WindowsPrograms″代表程序菜單。
2.2 改變盤(pán)符名稱(chēng)
如何改變硬盤(pán)、電子盤(pán)、CF卡等的盤(pán)符名稱(chēng),是平臺(tái)必須考慮的問(wèn)題,因?yàn)橛行?yīng)用程序?qū)τ诒P(pán)符的名稱(chēng)要求是固定的。
以改變CF盤(pán)盤(pán)符為例,也可以改變CF ATAPI驅(qū)動(dòng)的注冊(cè)表設(shè)置,其位置為:
[HKEY_LOCAL_MACHINESystemStorageManager
ProfilesATA]
″Name″=″ATAPI Device″
″Folder″=LOC_STORE_HD_FOLDER
將LOC_STORE_HD_FOLDER改為需要的盤(pán)符,例如“Compact flash”等。
2.3 設(shè)置存儲(chǔ)設(shè)備
任何嵌入式設(shè)備都需要存儲(chǔ)設(shè)備存儲(chǔ)信息。由于CF卡之外的其他設(shè)備都有比較明確的驅(qū)動(dòng)模塊,所以這里僅對(duì)加入CF卡設(shè)備進(jìn)行說(shuō)明。如果要加入CF設(shè)備,首先需要加入Storage Devices/Compact Flash/PC Card Storage(ATADISK)特色,這是必要條件。另外還需要PCMCIA支持,因?yàn)镃F卡接口是PCMCIA的擴(kuò)展。如果PCMCIA控制器不屬于微軟支持之列,則還需要編寫(xiě)驅(qū)動(dòng)程序來(lái)驅(qū)動(dòng)特定的硬件。不要加入U(xiǎn)SB特色,因?yàn)樗cCF卡或者ATAPI存儲(chǔ)器沒(méi)有關(guān)系。
2.4 設(shè)置網(wǎng)絡(luò)適配器
網(wǎng)絡(luò)化是嵌入式設(shè)備的發(fā)展方向,這里以Intel 82559ER單口網(wǎng)卡為例進(jìn)行說(shuō)明。
首先用一個(gè)文本編輯器對(duì)CONFIG.BIB和PLATFORM.REG文件進(jìn)行修改。網(wǎng)絡(luò)適配器需要它自己?jiǎn)为?dú)地預(yù)留內(nèi)存,這些信息在文件CONFIG.BIB中表示,其大小應(yīng)該符合默認(rèn)大小(大約120KB),而且不能和其他預(yù)留的內(nèi)存相沖突。第二,網(wǎng)絡(luò)適配器也需要在文件PLATFORM.REG中加入注冊(cè)表信息,其中IP和網(wǎng)關(guān)的設(shè)置可以根據(jù)實(shí)際應(yīng)用進(jìn)行修改。第三,修改CE物理地址注冊(cè)表數(shù)值與在CONFIG.BIB文件描述的內(nèi)存范圍的基地址相符合。在Windows CE .net系統(tǒng)中,PCI插槽不再需要通過(guò)注冊(cè)表設(shè)置,系統(tǒng)可以通過(guò)列舉PCI總線得到這些信息。同樣,也不需要手動(dòng)設(shè)置網(wǎng)絡(luò)地址綁定、路由和連接等信息,這些都由操作系統(tǒng)負(fù)責(zé)處理。
下面是將一塊Intel Pro 10/100單口網(wǎng)絡(luò)適配器加入系統(tǒng)的部分程序。


2.5 調(diào)試控制面板程序
如何調(diào)試Windows CE .net控制面板程序(Control Applet),對(duì)增強(qiáng)Windows CE .net的功能十分重要。Windows CE的控制面板程序是動(dòng)態(tài)鏈接庫(kù)(DLLS),可以通過(guò)三個(gè)步驟進(jìn)行調(diào)試:(1)創(chuàng)建一個(gè).exe文件去加載自己的.cpl文件。(2)在開(kāi)發(fā)環(huán)境中Project->Settings->Debug設(shè)置“Executable for debug session”和“Remote executable path and file name”為該.exe文件名。(3)設(shè)置“Additional Dll′s”參數(shù)為要加載的.cpl或.dll文件。
當(dāng)然,也可以通過(guò)這個(gè)方法來(lái)調(diào)試別的.dll文件。
2.6 編寫(xiě)設(shè)備驅(qū)動(dòng)
編寫(xiě)設(shè)備驅(qū)動(dòng)的最好辦法是在一個(gè)同類(lèi)設(shè)備的驅(qū)動(dòng)上進(jìn)行改造。
(1)復(fù)制一個(gè)設(shè)備的驅(qū)動(dòng),修改它的文件夾,換成需要的名字,這里包含*.c、*.h文件和源文件,更換*.c、*.h的內(nèi)容,相應(yīng)更換源文件的內(nèi)容。
(2)在Dir文件中加入自己的文件夾名字。
*.c、*.h文件需自己生成,不會(huì)自動(dòng)生成。source dir file可以用一些生成文件的程序生成。
3 下載和調(diào)試操作系統(tǒng)
3.1 準(zhǔn)備工作
確認(rèn)CE目標(biāo)機(jī)上是否裝有MS-DOS 6.22。若沒(méi)有,則按照以下步驟制作啟動(dòng)軟盤(pán):(1)準(zhǔn)備一張空的軟盤(pán)。(2)制作MS-DOS 6.22啟動(dòng)軟盤(pán)。(3)在BIOS中設(shè)置計(jì)算機(jī)從軟盤(pán)驅(qū)動(dòng)器啟動(dòng),使用軟盤(pán)啟動(dòng)您的計(jì)算機(jī),進(jìn)入MS-DOS 6.22。(4)順利進(jìn)入到MS-DOS 6.22操作系統(tǒng)后,MS-DOS 6.22啟動(dòng)軟盤(pán)(以下簡(jiǎn)稱(chēng)啟動(dòng)軟盤(pán))制作完成。
3.2 制作CE目標(biāo)機(jī)啟動(dòng)硬盤(pán)/CF卡/DOC
(1)為CE目標(biāo)機(jī)的硬盤(pán)/CF卡/DOC建立一個(gè)FAT16的主引導(dǎo)分區(qū)(注:使用啟動(dòng)軟盤(pán)中的FDISK工具)。
(2)將主引導(dǎo)分區(qū)格式化,并創(chuàng)建系統(tǒng)引導(dǎo)文件。例如:從啟動(dòng)軟盤(pán)啟動(dòng)計(jì)算機(jī)后,使用“A:FORMAT C:/S”命令格式化目標(biāo)硬盤(pán)/CF卡/DOC。
(3)將啟動(dòng)軟盤(pán)上的所有文件復(fù)制到目標(biāo)硬盤(pán)/CF卡/DOC。
(4)在文件Autoexec.bat中加入“loadcepc nk.bin”,在文件Config.sys中加入“device=himem.sys”。將Himem.sys(ver 6.22)、loadcepc.exe拷貝進(jìn)目標(biāo)盤(pán)。
(5)新建并編輯bootcepc.cnf文件,作為啟動(dòng)文件,并加入以下內(nèi)容:
N:NK BIN ;標(biāo)記N:參數(shù)說(shuō)明Loadcepc要加載的BIN文件名稱(chēng)。
S:BOOTCEPC.bmp ;標(biāo)記S:參數(shù)說(shuō)明要顯示的圖片名稱(chēng)。
L:640x480x16 ;標(biāo)記L:參數(shù)為Windows CE啟動(dòng)后的顯示分辨率。
如果通過(guò)網(wǎng)絡(luò)或者串口進(jìn)行調(diào)試,也可以加入下面的參數(shù):
B:3 ;標(biāo)記B:表示連接的波特率,在串口連接時(shí)使用。
E:0:0:192.168.0.124 ;標(biāo)記E:參數(shù)為網(wǎng)絡(luò)下載指定本機(jī)IP地址。
(6)在BIOS中設(shè)置計(jì)算機(jī)從目標(biāo)硬盤(pán)/CF卡/DOC啟動(dòng)。計(jì)算機(jī)使用目標(biāo)硬盤(pán)/CF卡/DOC啟動(dòng)到MS-DOS6.22后,制作啟動(dòng)硬盤(pán)/CF卡/DOC完成。
3.3 啟動(dòng)系統(tǒng)進(jìn)行調(diào)試
(1)將影像文件NK.BIN復(fù)制到CE目標(biāo)機(jī)硬盤(pán)/CF卡/DOC引導(dǎo)分區(qū)。(2)重新啟動(dòng)計(jì)算機(jī),使用CE目標(biāo)機(jī)硬盤(pán)/CF卡/DOC引導(dǎo)系統(tǒng)。(3)調(diào)試操作系統(tǒng)。
4 評(píng)估并發(fā)布操作系統(tǒng)
4.1 定制啟動(dòng)畫(huà)面
如果要發(fā)布一個(gè)操作系統(tǒng),就要改造其外觀,加入設(shè)備名稱(chēng)、單位圖標(biāo)等標(biāo)識(shí)。首先使用Photoshop或CorelDraw等圖形制作工具制作自己的BMP圖片,推薦圖片分辨率為640*480和800*600,顏色深度為256色和24位真彩色;然后將圖片復(fù)制到存放操作系統(tǒng)鏡像的存儲(chǔ)設(shè)備中,替換原有的標(biāo)準(zhǔn)界面文件;最后重新啟動(dòng)計(jì)算機(jī)。
4.2 設(shè)置注冊(cè)機(jī)制
軟件開(kāi)發(fā)的成果需要保護(hù),一般采用注冊(cè)機(jī)制。注冊(cè)序列號(hào)是根據(jù)每臺(tái)設(shè)備硬件情況生成的。在提示注冊(cè)頁(yè)面上,根據(jù)每臺(tái)設(shè)備的硬件組成,會(huì)出現(xiàn)數(shù)量不一的序列號(hào)碼。一個(gè)最簡(jiǎn)單的辦法是得到CPU ID或者存儲(chǔ)設(shè)備(如硬盤(pán)的序列號(hào)),隨機(jī)生成一個(gè)序列號(hào),根據(jù)序列號(hào)經(jīng)過(guò)加密算法解算注冊(cè)碼。一般可以通過(guò)kenealioctrl、GetVersionEx、GetSystemInfo等函數(shù)獲得系統(tǒng)信息。具體用哪些數(shù)據(jù),可以根據(jù)需要來(lái)確定。注冊(cè)軟件做好后還應(yīng)該和操作系統(tǒng)集成。啟動(dòng)操作系統(tǒng)的同時(shí)啟動(dòng)輸入序列號(hào),只有輸入了正確的序列號(hào)后才能正確使用。因?yàn)椴僮飨到y(tǒng)的鏡像文件一般都是只讀的,所以有些人將注冊(cè)信息寫(xiě)入注冊(cè)表中,實(shí)際是不可靠的,最好將其加密存入文件中的某個(gè)部位。
4.3 集成嵌入式軟件
基于32位CPU的WinCE設(shè)備嵌入式軟件由操作系統(tǒng)和應(yīng)用程序(AP)二個(gè)部分組成。在Windows CE中體現(xiàn)為NK.bin和應(yīng)用程序包AP,也可將AP集成到NK.bin中。這二種形式各自具備它們的優(yōu)缺點(diǎn),如表1所示。

在可能的情況下,嵌入式軟件或者應(yīng)用程序應(yīng)該集成在操作系統(tǒng)中,防止更改。當(dāng)然,也可以單獨(dú)存放。
參考文獻(xiàn)
1 Boling D.Microsoft Windows CE程序設(shè)計(jì).北京:北京大學(xué)出版社,1999
2 Goggin T A.Windows CE高級(jí)開(kāi)發(fā)指南.北京:電子工業(yè)出版社. 2000
3 Microsoft.Windows CE通信指南.北京:希望電子出版社,1999
4 Microsoft.How to Write and Use ActiveX Controls for Windows CE.http://www.microsoft.com/embeded.2003
