<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > WinCE和Win2000/XP設備驅動(dòng)開(kāi)發(fā)的區別

WinCE和Win2000/XP設備驅動(dòng)開(kāi)發(fā)的區別

作者: 時(shí)間:2009-12-28 來(lái)源:網(wǎng)絡(luò ) 收藏

引 言

Windows CE是一個(gè)32位、多任務(wù)、多線(xiàn)程的嵌入式操作系統,是微軟專(zhuān)門(mén)為信息設備、移動(dòng)應用、消費類(lèi)電子產(chǎn)品、嵌入式應用等非PC領(lǐng)域設計的操作系統產(chǎn)品,在外觀(guān)和使用的感覺(jué)上十分接近桌面Windows系統。它使用平面內存模式尋址,可以同時(shí)運行多個(gè)程序并支持一個(gè)程序中的多個(gè)線(xiàn)程,并且非常精煉,只有很小的內存要求。與基于PC的操作系統不同,Windows CE不需要標準硬件,反而支持各種各樣的CPU(如X86、PowerPC、ARM、MIPS等),通過(guò)OEM適配層(OEM adaptation layer)可以把Windows CE適配到任何硬件平臺。Windows CE是微軟Windows操作系統家族的一個(gè)成員,支持用于Windows 2000/XP和Windows 98等桌面Windows操作系統的Win32 API的一個(gè)子集。由于它不是桌面Windows操作系統的一部分或縮減版本,使得開(kāi)發(fā)Windows CE的與開(kāi)發(fā)桌面Windows的有所不同。本文將著(zhù)重討論這些區別,以使廣大熟悉桌面Windows開(kāi)發(fā)的程序員能快速掌握嵌入式操作系統WindowsCE驅動(dòng)程序的開(kāi)發(fā)方法。

1 驅動(dòng)結構模型比較

在桌面Windows系統,以支持Windows2000/XP的WDM驅動(dòng)模型為例。WDM體系結構實(shí)行分層處理,即設備驅動(dòng)被分成了若干層——最高層驅動(dòng)程序、中間層驅動(dòng)程序、最低層驅動(dòng)程序,如圖1所示。

在Windows CE驅動(dòng)中,按驅動(dòng)的結構可以分為兩種類(lèi)型——分層式設備驅動(dòng)程序和整體式驅動(dòng)程序,如圖2所示。分層式設備驅動(dòng)程序由上層和下層兩部分代碼組成。上層的程序叫做模型設備驅動(dòng)程序(MDD),下層的程序則叫做平臺相關(guān)的驅動(dòng)程序(PDD)。整體式驅動(dòng)程序的源代碼由中斷服務(wù)線(xiàn)程代碼和針對平臺的代碼組成。

同桌面Windows設備驅動(dòng)結構模型相比,Windows CE設備驅動(dòng)相對簡(jiǎn)單一些。正如圖1和圖2所示,兩種操作系統的設備驅動(dòng)雖然存在許多相似的地方,都采用了模塊、分層的設計方法,但是還存在許多不同的地方。在Windows CE操作系統中,分層的驅動(dòng)程序并不適用于所用的驅動(dòng),尤其是將驅動(dòng)程序分為兩層將會(huì )導致在驅動(dòng)程序操作時(shí)附加的功能調用,這無(wú)疑會(huì )降低驅動(dòng)程序的效率。對于時(shí)間或性能關(guān)鍵的實(shí)時(shí)操作,整體式驅動(dòng)程序將會(huì )更適合。

在桌面Windows系統中,驅動(dòng)各層通信之間使用一種稱(chēng)為I/O請求包(IRP)的數據結構進(jìn)行通信。影響到設備的每個(gè)操作都使用I/O請求包,采用層次結構可以使I/O請求過(guò)程更加明了。I/O管理器發(fā)送IRP來(lái)請求驅動(dòng)程序的處理,通常IRP由分層的驅動(dòng)程序棧來(lái)處理,高層的驅動(dòng)程序把請求劃分成更簡(jiǎn)單的請求并傳遞給下層驅動(dòng)程序。IRP首先被送到設備堆棧的最上層驅動(dòng)程序,然后逐漸過(guò)濾到下層的驅動(dòng)程序。每一層驅動(dòng)程序都可以決定如何處理IRP。而Windows CE驅動(dòng)各層之間的通信沒(méi)有采用IRP通信機制,而是通過(guò)接口函數調用實(shí)現的。設備驅動(dòng)程序接口(Device Driver Interface,DDI)是在MDD層中實(shí)現的函數集,系統中的GWES模塊通過(guò)這個(gè)接口調用設備驅動(dòng)程序;設備驅動(dòng)程序服務(wù)器接口(Device Driver Service Provider Interface,DDSI)是在PDD層中實(shí)現的函數集并由MDD調用。

2 設備驅動(dòng)組成部分比較

簡(jiǎn)單地說(shuō),驅動(dòng)程序是一些例程的集合,它們被動(dòng)地存在,等待主機系統軟件來(lái)調用或激活它們。在Win-dows系統中驅動(dòng),具體的驅動(dòng)程序有所不同,其包含的例程也不同,但其主要例程是相同的。圖3描述一個(gè)Windows驅動(dòng)的基本流程。

以下從幾個(gè)方面闡述WindowsCE和桌面Windows設備驅動(dòng)組成的不同。

2.1 驅動(dòng)程序的入口點(diǎn)

在桌面Windows和Windows CE兩個(gè)系統中的驅動(dòng)程序都含有初始化模塊,該模塊主要功能是完成驅動(dòng)程序的初始化及卸載。在桌面Windows系統的初始化模塊中,包括每一個(gè)設備驅動(dòng)程序都有的一個(gè)初始化入口點(diǎn)——DriverEntry例程,每次設備驅動(dòng)程序啟動(dòng)時(shí)該例程被系統自動(dòng)調用。其最重要的功能是設置驅動(dòng)程序對應于I/O請求的主功能代碼(MajorFunction)的回調例程。DriverEntry例程如下:

其中,AddDevice例程是在系統添加一個(gè)設備時(shí)被PnP管理器調用的,其主要工作是創(chuàng )建并初始化設備對象;DriverUnload例程在系統卸載硬件時(shí)使用,由I/O管理器調用,釋放所有資源。初始化模塊中還包括Create和Close兩個(gè)例程,這是Win32程序獲得和釋放設備句柄的唯一途徑。

與桌面Windows設備驅動(dòng)程序開(kāi)發(fā)相比,WindowsCE設備驅動(dòng)程序開(kāi)發(fā)的主要難點(diǎn)是,對于不同類(lèi)型設備的驅動(dòng)程序架構是不一樣的。以流接口驅動(dòng)程序為例,Windows CE設備驅動(dòng)程序是用戶(hù)模式動(dòng)態(tài)鏈接庫(DLL),其入口點(diǎn)在不同的情況有一些細微的差別,主要入口點(diǎn)包括XXX_Init、XXX_Deinit、XXX_Open、XXX_Close、XXX_IOControl、XXX_Read、XXX_Seek、XXX_PowerUp和XXX_PowerDown,在實(shí)際開(kāi)發(fā)中接口名稱(chēng)中的XXX三個(gè)字母由設備驅動(dòng)的設備文件名前綴代替。

2.2 與應用程序的通信

設備驅動(dòng)程序構造成功之后,將它與設備一同安裝進(jìn)系統,以便用戶(hù)可以對設備進(jìn)行適當的控制及訪(fǎng)問(wèn)。在桌面Windows和Windows CE兩個(gè)系統中使用Win32 API實(shí)現硬件的訪(fǎng)問(wèn)。首先調用CreateFile創(chuàng )建一個(gè)設備的連接,獲得該設備的句柄(Handle),然后根據需要調用ReadFile、WriteFile、DeviceIoControI等函數對設備進(jìn)行讀寫(xiě)或者其他I/O控制操作,最后調用CloseHandle關(guān)閉設備。

在桌面Windows系統中,當用戶(hù)需要訪(fǎng)問(wèn)某設備時(shí),必須首先取出指定設備全局唯一標識符(GUID)的設備信息集,枚舉設備實(shí)例的接口數據,從中獲得設備的符號鏈接名,然后調用CreatFile創(chuàng )建設備,并獲得設備句柄,而在驅動(dòng)程序內部通過(guò)處理IRP響應來(lái)自Win32應用程序對IRP_MJ_CREATE、IRP_MJ_READ、IRP_MJ_WRITE和IRP_MJ_OCTL等請求。IRP由IRP首部結構和一系列的棧單元組成,每個(gè)棧單元是一個(gè)IO_STACK_LOCA-TION結構。驅動(dòng)程序僅需知道當前I/O棧單元和IRP首部結構中的信息就可以對IRP進(jìn)行處理。驅動(dòng)程序處理完IRP后,使用IoCompleteRequest函數通知I/O管理器,可以通過(guò)其參數設定狀態(tài)碼和返回的字節數。在Windows CE系統中,應用程序需要了解中斷處理線(xiàn)程中數據的輸入輸出完成情況,以便及時(shí)地處理。這就需要建立應用程序和設備驅動(dòng)程序的同步通信。

2.3 設備名

在Windows設備驅動(dòng)中,為了提供Win32程序可用的名字,必須為每個(gè)設備創(chuàng )建符號鏈接。在桌面Windows和Windows CE兩個(gè)系統中,都可以采用一個(gè)明確的符號鏈接名。一個(gè)具體設備名稱(chēng)是由設備名前綴和設備名索引組成的,即3個(gè)大寫(xiě)字母、1位數字和冒號組成。另外在桌面Windows系統中,還可以采用設備接口為設備創(chuàng )建符號鏈接。每個(gè)設備接口由一個(gè)128位全局唯一標識符(GUID)標志。把設備注冊為一個(gè)特定的設備接口就創(chuàng )建了一個(gè)符號鏈接。用戶(hù)態(tài)設備可以取得擁有此GUID的設備。

2. 4 驅動(dòng)程序的運行模式

在Windows系統中支持兩種基本模式的驅動(dòng)程序類(lèi)型,即用戶(hù)模式(user mode)和內核模式(kernel mode),不同的模式允許不同層次的內存存取和系統資源的分配。內核模式驅動(dòng)程序則由運行于內核模式的系統級代碼組成,它們沒(méi)有系統資源存取的限制,可以執行任何有效的CPU指令,被用來(lái)直接控制硬件。用戶(hù)模式驅動(dòng)程序是按用戶(hù)模式運行的系統級代碼,它們不能使用直接的硬件I/O指令來(lái)訪(fǎng)問(wèn)硬件。

桌面Windows系統一般要求設備驅動(dòng)運行在內核模式下。內核模式提供設備資源的直接訪(fǎng)問(wèn),沒(méi)有固定的用戶(hù)模式的輔助操作。

Windows CE系統一般要求設備驅動(dòng)運行在用戶(hù)模式下。這種運行在用戶(hù)模式下的設備驅動(dòng)程序有許多優(yōu)點(diǎn),最明顯的優(yōu)點(diǎn)是當設備驅動(dòng)開(kāi)發(fā)有錯誤動(dòng)作時(shí),內核被有效地保護起來(lái)了,因此內核被驅動(dòng)程序破壞,或者可能導致不能重新啟動(dòng)內核的潛在目標存儲錯誤,以及其他意想不到的災難等發(fā)生的可能性就明顯地減少。

2.5 驅動(dòng)程序的安裝

桌面Windows的驅動(dòng)安裝通過(guò)INF文件。INF文件是一個(gè)文本文件,含有安裝一個(gè)WDM驅動(dòng)設備程序需要的所有必需的信息,包括要復制的文件列表、要創(chuàng )建的注冊表項等。驅動(dòng)根據INF文件中的指令安裝,驅動(dòng)程序可執行文件被復制到正確的位置,通常是Windows Sys-tem32\Drivers目錄,然后創(chuàng )建各種注冊表項。WindowsCE和桌面Windows之間的最大區別是,Windows CE不支持.sys和.inf文件。Windows CE設備驅動(dòng)編譯成動(dòng)態(tài)庫,將驅動(dòng)的動(dòng)態(tài)庫文件直接拷入Windows\目錄,然后創(chuàng )建各種注冊表項即可。這就減少了Windows CE加載程序的復雜性和大小。

3 開(kāi)發(fā)環(huán)境比較

在桌面Windows系統中,驅動(dòng)程序的開(kāi)發(fā)采用兩種方式。一類(lèi)是Microsoft公司提供的Windows DDK(De-vice Driver Kit),由于DDK基于匯編語(yǔ)言的編程方式和內核模式的調用,對沒(méi)有深厚的OS原理和編程水平的人員來(lái)說(shuō),任務(wù)相當艱巨。另一類(lèi)是NuMega公司提供的DriverStudio,它是一個(gè)大的開(kāi)發(fā)工具包,包含VtoolsD、SoftICE和DriverWorks等開(kāi)發(fā)工具。利用DriverStudio開(kāi)發(fā)WDM驅動(dòng)程序,可以大大減輕開(kāi)發(fā)人員的工作量、縮短開(kāi)發(fā)周期,以及降低開(kāi)發(fā)驅動(dòng)程序的難度。

Windows CE開(kāi)發(fā)平臺的開(kāi)發(fā)者、獨立硬件供應商(IHVS)和應用程序開(kāi)發(fā)者都會(huì )從事基于Windows CE平臺的設備驅動(dòng)程序開(kāi)發(fā)。對于不同的開(kāi)發(fā)者,微軟為Windows CE提供了2種開(kāi)發(fā)工具:Platform Builder和Embedded Visual Tools。Platform Builder是一個(gè)定制基于Windows CE操作系統的嵌入式平臺的集成開(kāi)發(fā)環(huán)境(IDE),為創(chuàng )建Windows CE嵌入式系統提供了全部相關(guān)工具,范圍從用來(lái)開(kāi)發(fā)基于Windows CE的應用程序和設備驅動(dòng)程序,到用來(lái)創(chuàng )建操作系統各種自定義版本。而Embedded Visual Tools主要用于上層應用程序、驅動(dòng)的開(kāi)發(fā),功能類(lèi)似于桌面Windows平臺上的開(kāi)發(fā)工具VC、VB等。這個(gè)工具的核心是Embedded Visual C++,它具有和Visual C++6.0基本相同的特性,包括對MFC、ATL以及COM/DCOM的支持、應用程序向導、編譯調試等多種功能。

結 語(yǔ)

理解Windows CE與桌面Windows設備驅動(dòng)程序開(kāi)發(fā)的區別,有助于廣大熟悉桌面Windows設備驅動(dòng)程序開(kāi)發(fā)的程序員快速掌握嵌入式操作系統Windows CE的設備驅動(dòng)程序開(kāi)發(fā)。近幾年來(lái),信息家電、掌上電腦、電視機頂盒等基于Windows CE操作系統的設備已變得越來(lái)越普及,而Windows CE上的設備驅動(dòng)程序還比較少,因此Windows CE設備驅動(dòng)程序具有不少潛力和市場(chǎng)。希望本文對打算開(kāi)發(fā)Windows CE設備驅動(dòng)程序的人們有所幫助。



關(guān)鍵詞: WinCE Win2000/XP 驅動(dòng)程序

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>