設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)_第1頁(yè)
設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)_第2頁(yè)
設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)_第3頁(yè)
設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)_第4頁(yè)
設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)_第5頁(yè)
已閱讀5頁(yè),還剩77頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

嵌入式軟件開(kāi)發(fā)導(dǎo)論同濟(jì)大學(xué)軟件學(xué)院20057.設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)主要內(nèi)容概述流驅(qū)動(dòng)接口設(shè)備驅(qū)動(dòng)程序架構(gòu)USBmouse驅(qū)動(dòng)開(kāi)發(fā)示例WindowsCE系統(tǒng)服務(wù)什么是設(shè)備驅(qū)動(dòng)程序設(shè)備驅(qū)動(dòng)程序是與硬件設(shè)備進(jìn)行通信的系統(tǒng)程序。一個(gè)設(shè)備可以是物理設(shè)備,也可以是一個(gè)邏輯實(shí)體。通常,這些實(shí)體需要操作系統(tǒng)對(duì)其進(jìn)行控制,資源管理。設(shè)備驅(qū)動(dòng)程序就是管理這些物理設(shè)備或者虛擬設(shè)備,協(xié)議或者系統(tǒng)服務(wù)的軟件模塊。

對(duì)于每一個(gè)基于WindowsCE的設(shè)備,設(shè)備驅(qū)動(dòng)程序都是必不可少。--譯自MSDN“一般”驅(qū)動(dòng)程序開(kāi)發(fā)的理解必須使用匯編語(yǔ)言對(duì)端口進(jìn)行讀寫(xiě)設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)的一部分,難于開(kāi)發(fā)與調(diào)試。設(shè)備驅(qū)動(dòng)程序控制硬件中斷比較難于處理必須使用匯編語(yǔ)言讀寫(xiě)端口CEDDK.dll提供APIs與硬件進(jìn)行通信HalGetBusDataREAD_PORT_UCHARWRITE_REGISTER_ULONG對(duì)于邏輯設(shè)備驅(qū)動(dòng)程序,采用Win32APIs從硬件獲取數(shù)據(jù)設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)的一部分,難于開(kāi)發(fā)與調(diào)試對(duì)于UNIX或者是Windows9x,設(shè)備驅(qū)動(dòng)程序是與操作系統(tǒng)映像連接的,并運(yùn)行于系統(tǒng)內(nèi)核態(tài)。對(duì)于windowsCE,大多數(shù)的設(shè)備驅(qū)動(dòng)程序運(yùn)行于用戶態(tài),簡(jiǎn)單的來(lái)說(shuō)就是一個(gè)DLL文件。設(shè)備驅(qū)動(dòng)程序控制硬件大多數(shù)的設(shè)備驅(qū)動(dòng)程序用來(lái)控制硬件。對(duì)于某些硬件,是沒(méi)有驅(qū)動(dòng)的。CPU內(nèi)存對(duì)于虛擬設(shè)備驅(qū)動(dòng)程序,沒(méi)有物理設(shè)備。文件系統(tǒng)驅(qū)動(dòng)程序RAMdisk中斷有時(shí)難于處理WindowsCE提供邏輯中斷(SYSINTRs)中斷由一個(gè)用戶態(tài)的線程進(jìn)行處理(IST)為什么應(yīng)當(dāng)寫(xiě)驅(qū)動(dòng)程序?當(dāng)我們?cè)O(shè)計(jì)硬件時(shí),就需要提供這一硬件的驅(qū)動(dòng)軟件。硬件OEM廠商不提供基于WindowsCE的硬件驅(qū)動(dòng),但是提供硬件的規(guī)格說(shuō)明。對(duì)于一個(gè)現(xiàn)有硬件驅(qū)動(dòng)的功能進(jìn)行擴(kuò)展。驅(qū)動(dòng)分類—整體

WindowsCE整體上將設(shè)備驅(qū)動(dòng)分為三種:內(nèi)置驅(qū)動(dòng)總線流接口內(nèi)置驅(qū)動(dòng)硬件所必須的的驅(qū)動(dòng)程序,,這些驅(qū)動(dòng)程程序通常由設(shè)設(shè)計(jì)OEM廠商進(jìn)行設(shè)計(jì)計(jì)。如:鍵盤(pán),觸摸屏屏,音頻設(shè)備備??赡懿恢С忠灰话愕尿?qū)動(dòng)接接口,也有可可能帶有擴(kuò)展展的接口或者者完全提供一一個(gè)用戶自定定義的接口。。內(nèi)置驅(qū)動(dòng)通常常需要針對(duì)具具體的操作系系統(tǒng)進(jìn)行小幅幅改動(dòng)??偩€驅(qū)動(dòng)管理系統(tǒng)總總線如PCI總線等。PCMCIA與CompactFlash也在其列。。負(fù)責(zé)處理總總線上硬件件的詢問(wèn),,以及資源源的分配。。同時(shí)也請(qǐng)求求設(shè)備管理理器為總線線上的硬件件安裝適當(dāng)當(dāng)驅(qū)動(dòng)程序序。驅(qū)動(dòng)分類–詳細(xì)AudioDriversBatteryDriversBlockDriversBluetoothHCITransportDriverDirect3DDeviceDriverInterfaceDirectDrawDisplayDriversDisplayDriversDVD-VideoRendererIEEE1394DriversKeyboardDriversNotificationLEDDriversParallelPortDriversPCCardDriversPrinterDriversSerialPortDriversSmartCardDriversStreamInterfaceDriversTouchScreenDriversUSBDrivers參見(jiàn)文檔:DriverDevelopment->DriverCategories驅(qū)動(dòng)的加載載過(guò)程大多數(shù)的設(shè)設(shè)備驅(qū)動(dòng)由由設(shè)備管理理器(Device.exe)進(jìn)程在系統(tǒng)統(tǒng)啟動(dòng)時(shí)進(jìn)進(jìn)行加載。。另一方面,,其中一部部分內(nèi)置驅(qū)驅(qū)動(dòng)程序由由GWES.exe進(jìn)行加載。。這些驅(qū)動(dòng)動(dòng)包括顯示示器驅(qū)動(dòng)(DDI.dll)、鍵盤(pán)驅(qū)動(dòng)、、鼠標(biāo)驅(qū)動(dòng)動(dòng)、觸摸屏屏驅(qū)動(dòng)等。。驅(qū)動(dòng)的加載載過(guò)程當(dāng)Device.exe對(duì)設(shè)備驅(qū)動(dòng)動(dòng)程序進(jìn)行行安裝時(shí)將將在注冊(cè)表表的[HKEY_LOCAL_MACHINE]\Drivers項(xiàng)下檢查一一個(gè)字符串串,其值為為RootKey,傳統(tǒng)地,,其名字為為BuiltIn。然后設(shè)備管管理器在進(jìn)進(jìn)行初始化化時(shí)使用注注冊(cè)信息檢檢查器為它它需要安裝裝的各個(gè)驅(qū)驅(qū)動(dòng)讀取值值為RootKey的鍵。驅(qū)動(dòng)的加載載過(guò)程驅(qū)動(dòng)的加載載過(guò)程安裝DLL,給每一個(gè)驅(qū)驅(qū)動(dòng)創(chuàng)建一一個(gè)Active鍵,然后調(diào)調(diào)用ActivateDevice或者ActivateDeviceEx將DLL注冊(cè)為系統(tǒng)統(tǒng)中的一個(gè)個(gè)設(shè)備驅(qū)動(dòng)動(dòng)程序。ActivateDevice在[HKEY_LOCAL_MACHINE\Drivers\Active下創(chuàng)建一個(gè)個(gè)新的鍵值值。驅(qū)動(dòng)的加載載過(guò)程驅(qū)動(dòng)加載API設(shè)備驅(qū)動(dòng)程程序也能通通過(guò)應(yīng)用程程序進(jìn)行手手動(dòng)的安裝裝,這是ActivateDeviceEx的一個(gè)首選選的功能。。安裝驅(qū)動(dòng)一一個(gè)更老的的方法是使使用RegisterDevice與DeregisterDevice主要內(nèi)容概述流驅(qū)動(dòng)接口口設(shè)備驅(qū)動(dòng)程程序架構(gòu)USBmouse驅(qū)動(dòng)開(kāi)發(fā)示示例WindowsCE系統(tǒng)服務(wù)什么是流接接口流接口驅(qū)動(dòng)動(dòng)包括所有有提供流接接口函數(shù)的的驅(qū)動(dòng)程序序,不管由由這個(gè)驅(qū)動(dòng)動(dòng)控制的設(shè)設(shè)備是什么么類型。典型的流接接口驅(qū)動(dòng)程程序有:文件系統(tǒng)驅(qū)驅(qū)動(dòng)(iostream,fstream)COM,LPT使用流接接口hSer=CreateFile(TEXT(“COM1:”),GENERIC_READ,0,NULL,OPEN_EXSITING,0,NULL);rc=ReadFile(hSer,&ch,1,&cBytes,NULL);TransmitCommChar(hSer,‘a(chǎn)’);CloseHandle(hSer);直接使用用Win32文件系統(tǒng)統(tǒng)API。。創(chuàng)建一個(gè)個(gè)流驅(qū)動(dòng)動(dòng)程序?qū)懸粋€(gè)導(dǎo)導(dǎo)出具體體流接口口的DLL編譯設(shè)備備驅(qū)動(dòng)程程序?qū)ψ?cè)表表進(jìn)行配配置流接口函函數(shù)函數(shù)名說(shuō)明XXX_Close關(guān)閉以hOpenContext標(biāo)識(shí)的設(shè)備上下文。XXX_Deinit由設(shè)備管理器調(diào)用來(lái)刪除對(duì)某一設(shè)備的初始化信息。XXX_Init由設(shè)備管理器調(diào)用來(lái)對(duì)某一設(shè)備進(jìn)行初始化。XXX_IOControl向設(shè)備發(fā)送命令XXX_Open打開(kāi)一個(gè)設(shè)備以進(jìn)行讀、寫(xiě)或者既讀又寫(xiě)。當(dāng)應(yīng)用調(diào)用CreateFile來(lái)打開(kāi)某一個(gè)設(shè)備文件名時(shí)將間接地調(diào)用這一個(gè)函數(shù)。XXX_PowerDown停止向設(shè)備供電。只有在軟件控制下關(guān)機(jī)的設(shè)備上才可用。XXX_PowerUp恢復(fù)向設(shè)備供電XXX_Read從設(shè)備讀取數(shù)據(jù)XXX_Seek在設(shè)備中移動(dòng)數(shù)據(jù)指針XXX_Write向設(shè)備寫(xiě)數(shù)據(jù)構(gòu)建設(shè)備備驅(qū)動(dòng)程程序構(gòu)建設(shè)備備驅(qū)動(dòng)程程序與構(gòu)構(gòu)建一個(gè)個(gè)DLL一樣簡(jiǎn)單單??梢允褂糜肞latformBuilder與EVC++。只需創(chuàng)建建一個(gè)WindowsCEDLL項(xiàng)目,輸出適當(dāng)當(dāng)?shù)娜肴肟邳c(diǎn),,然后編編寫(xiě)代碼碼。常犯的一一個(gè)錯(cuò)誤誤是沒(méi)有有將入口口點(diǎn)聲明明為externC,因此C++編譯器就就不能處處理輸出出的函數(shù)數(shù)名。注冊(cè)表設(shè)設(shè)置在Project.reg中:[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Sample]"Dll"="mydriver.Dll""Prefix"="DEM""Index"=dword:1"Order"=dword:0"FriendlyName"="DemoDriver""Ioctl"=dword:0注冊(cè)表設(shè)設(shè)置Order給所有的的驅(qū)動(dòng)設(shè)設(shè)置相對(duì)對(duì)安裝順順序。Order為0的驅(qū)驅(qū)動(dòng)先安安裝,依依次安裝裝Order為1,2,…的的驅(qū)動(dòng)。。Oder可以讓開(kāi)開(kāi)發(fā)者保保證有相相到依賴賴關(guān)系的的多個(gè)驅(qū)驅(qū)動(dòng)以適適當(dāng)?shù)捻橅樞蜻M(jìn)行行安裝。。Index指定在文文件系統(tǒng)統(tǒng)中的驅(qū)驅(qū)動(dòng)名的的數(shù)字部部分。在在默認(rèn)情情況下,,帶有前前綴COM的驅(qū)動(dòng)在在文件系系統(tǒng)中分分配名字字為COM1,下一個(gè)即即為COM2。為了保證證驅(qū)動(dòng)總總是安裝裝成COM2,必須提供供Index=2。。演示:使用emulator編寫(xiě)一個(gè)個(gè)流接口口驅(qū)動(dòng)程程序并使使用它驅(qū)動(dòng)是如如何工作作的WhenCE啟動(dòng)時(shí),Device.exe根據(jù)注冊(cè)冊(cè)表中的的設(shè)置安安裝所有有的驅(qū)動(dòng)動(dòng)程序。。當(dāng)安裝mydriver.dll時(shí),device.exe調(diào)用DEM1_Init。。Application程序調(diào)用用CreateFile(“DEM1”…)驅(qū)動(dòng)是如如何工作作的(2)Coredll.dll處理API調(diào)用并切切換到device.exeDevice.exe調(diào)用mydriver.dll的DEM1_Open。。CreateFile返回DEM1_Open的retval設(shè)備功能能棧硬件WindowsCEDDKAPI設(shè)備驅(qū)動(dòng)動(dòng)程序設(shè)備管理理器(device.exe)應(yīng)用程序序主要內(nèi)容容概述流驅(qū)動(dòng)接接口設(shè)備驅(qū)動(dòng)動(dòng)程序架架構(gòu)USBmouse驅(qū)動(dòng)開(kāi)發(fā)發(fā)示例WindowsCE系統(tǒng)服務(wù)務(wù)驅(qū)動(dòng)架構(gòu)構(gòu)驅(qū)動(dòng)的類類型內(nèi)置與流流安裝機(jī)機(jī)制通常內(nèi)置置驅(qū)動(dòng)程程序根據(jù)據(jù)注冊(cè)鍵鍵值安裝裝在GWES進(jìn)程空間間總線驅(qū)動(dòng)動(dòng)由Device.exe根據(jù)鍵值值進(jìn)行安安裝可安裝的的流驅(qū)動(dòng)動(dòng)或其它它驅(qū)動(dòng)由由Device.exe根據(jù)總線線驅(qū)動(dòng)或或注冊(cè)檢檢查器進(jìn)進(jìn)行安裝裝。設(shè)備管理理器用戶級(jí)進(jìn)進(jìn)程繼續(xù)續(xù)運(yùn)行與內(nèi)核、、注冊(cè)表表交互的的單獨(dú)應(yīng)應(yīng)用程序序,以及及流接口口驅(qū)動(dòng)DLL。。提供ActivateDevice與DeactivateDeviceAPI。設(shè)備管理理器包括IO資源管理理器安裝注冊(cè)冊(cè)表檢查查器(RegEnum.dll),并由這一一個(gè)注冊(cè)冊(cè)表檢查查器根據(jù)據(jù)注冊(cè)表表進(jìn)行驅(qū)驅(qū)動(dòng)的安安裝提供電源源通知回回調(diào)函數(shù)數(shù)跟蹤所有有已安裝裝的驅(qū)動(dòng)動(dòng)程序,,給設(shè)備備接口發(fā)發(fā)出拉入入或刪除除的通知知設(shè)備管理理器設(shè)備驅(qū)動(dòng)動(dòng)程序的的安裝過(guò)過(guò)程DEVICE.EXEKernelI/OResourceManager(partofDevice.exe)REGENUM.DLLPCIBUS.DLLloadsloadsloadsDEVICE.EXEI/OResourceManager(partofDevice.exe)REGENUM.DLLPCIBUS.DLL注冊(cè)表枚枚舉器注冊(cè)枚舉舉器是RegEnum.dllDevice.exe根據(jù)HKEY_LOCAL_MACHINE\Drivers\RootKey安裝注冊(cè)冊(cè)枚舉器器注冊(cè)枚舉舉器給每每一個(gè)要要安裝的的驅(qū)動(dòng)程程序掃描描表項(xiàng)注冊(cè)枚舉舉器是可可重入的的,并支支持分級(jí)級(jí)使用當(dāng)注冊(cè)枚枚舉器卸卸載時(shí),,同時(shí)也也御載它它安裝的的所有信信息注冊(cè)枚舉舉器根據(jù)據(jù)Order,檢查緊挨挨著傳給給它的鍵鍵的下一一級(jí)鍵值值。注冊(cè)枚舉舉器對(duì)每每一個(gè)找找到的子子鍵調(diào)用用ActivateDeviceExActivateDeviceEx由Device.exe提供總線驅(qū)動(dòng)動(dòng)程序當(dāng)當(dāng)安裝設(shè)設(shè)備驅(qū)動(dòng)動(dòng)時(shí)調(diào)用用ActivateDeviceExActivateDeviceEx也在RAM工作區(qū)鎖鎖定流接接口驅(qū)動(dòng)動(dòng)程序這可以防防止代碼碼頁(yè)被丟丟棄注冊(cè)檢查查器對(duì)找找到的每每一個(gè)內(nèi)內(nèi)置子鍵鍵調(diào)用ActivateDeviceExActivateDeviceEx安裝驅(qū)動(dòng)動(dòng)并更新新注冊(cè)表表接口類驅(qū)動(dòng)程序序的接口口有以下下特征每一個(gè)Iclass有一個(gè)GUID,一個(gè)名字字GUID描述類設(shè)設(shè)備接口口Name描述接口口的實(shí)例例COM1:,DSK1:等等提供一個(gè)個(gè)驅(qū)動(dòng)接接口在注冊(cè)表表中的Iclass子鍵驅(qū)動(dòng)程序序發(fā)布接接口–AdvertiseInterface應(yīng)用程序序訪問(wèn)接接口–RequestDeviceNotifications每個(gè)已有有的接口口的預(yù)定定義GUIDA32942B7-920C-486b-B0E6-92A702A99B35I/O資源管理理(IORM)IORM是設(shè)備管管理器必必備的部部分跟蹤可用用I/O資源(IRQ與I/O基地址)OEM為內(nèi)置設(shè)設(shè)備預(yù)分分配的資資源當(dāng)在總線上上安裝一個(gè)個(gè)客戶驅(qū)動(dòng)動(dòng)時(shí),總線線驅(qū)動(dòng)請(qǐng)求求資源ResourceReleaseResourceRequestResourceCreateList當(dāng)存在沖突突時(shí)IORM調(diào)用ResourceRequest失敗注冊(cè)表幫助助例程從注冊(cè)表中中讀取資源源初始化信信息OpenDeviceKeyDDKReg_GetIsrInfoDDKReg_GetWindowInfoDDKReg_GetPciInfo在COREDLL的API在<devload.h>and<ddkreg.h>的函數(shù)原型型在public\common\oak\drivers中的例子wavedev\pdd\es1371\wavepdd.cpp->GetRegistryConfig電源管理電源管理器器靈活的系統(tǒng)統(tǒng)級(jí)與外設(shè)設(shè)級(jí)電源管管理使設(shè)備智能能化地管理理它們的電電源在設(shè)備與系系統(tǒng)或應(yīng)用用之間充當(dāng)當(dāng)協(xié)調(diào)者使OEM修改調(diào)用PowerOffSystem()的相關(guān)代碼碼電源管理系統(tǒng)級(jí)電源源狀態(tài)設(shè)備(外設(shè)設(shè))級(jí)電源源狀態(tài)打開(kāi)系統(tǒng)空閑用戶空閑掛起D0全供電D3睡眠D1降級(jí)模式D4關(guān)閉D2備用模式電源管理器器架構(gòu)驅(qū)動(dòng)電源管理器器(pm.dll)PMAPIs應(yīng)用程序通知消息隊(duì)隊(duì)列驅(qū)動(dòng)APIs應(yīng)用API物理內(nèi)存64MB

RAM32MB

FlashDbgSerialPort2GBUser512MB

Uncached512MB

Cached64MBRAM32MBFlash64MBRAM32MBFlash物理內(nèi)存內(nèi)核虛擬地地址Reserved04000000820000008000000080000000A0000000C00000000NotUsedSlot0Slot3264KB32MB64MB2GB3GB4GBMemorymappedfilesAbove2G-3GMappedtophysicalmemoryVirtualaddressspaceSlot1Slot32NULLpointers虛擬地址空空間512MCached

512MNon-Cached

0x800000000xA0000000AccessableviaMmMapiIoSpace內(nèi)存管理函函數(shù)設(shè)備驅(qū)動(dòng)程程序是用戶戶態(tài)模塊必須將物理理內(nèi)存映射射成虛擬內(nèi)內(nèi)存VirtualAlloc,VirtualFree:預(yù)留,釋放放虛擬內(nèi)存存MEM_RESERVEVirtualCopy:將一個(gè)物理理內(nèi)存區(qū)域域映射到一一個(gè)虛擬內(nèi)內(nèi)存區(qū)域PAGE_NOCACHEPAGE_PHYSICAL驅(qū)動(dòng)的內(nèi)存存訪問(wèn)與映映射MapPtrToProcess將一個(gè)地址址空間的指指針映射成成另外一個(gè)個(gè)指針GetCurrentProcess/SetProcPermissions重新找回進(jìn)進(jìn)程ID用于MapPtrToProcess函數(shù)MmMapIoSpace將一個(gè)物理理地址空間間映射成一一個(gè)不分頁(yè)頁(yè)的,由進(jìn)進(jìn)程決定的的地址空間間CEDDKCEv2.1x以及后來(lái)的的版本支持持獨(dú)立于平平臺(tái)的I/O配置讓OEM以及驅(qū)動(dòng)開(kāi)開(kāi)發(fā)人員使使用它們CEDDK.DLL總線管理內(nèi)存管理I/O管理從NTDDK拿來(lái)的CEDDKAPI直到V2.12以后的版本本才有文檔檔但在大多數(shù)數(shù)V2.00版中都有CEDDK簡(jiǎn)介設(shè)備驅(qū)動(dòng)使使用CEDDK正常開(kāi)發(fā)的的驅(qū)動(dòng)是跨跨平臺(tái)二進(jìn)進(jìn)制兼容的的跨CPU的源代碼兼兼容設(shè)備管理器器設(shè)備驅(qū)動(dòng)CEDDK.DLL硬件CEDDK內(nèi)容部分函示例總線管理HalGetBusDataByOffset()HalGetBusData()HalSetBusDataByOffset()HalSetBusData()HalTranslateBusAddress()HalTranslateSystemAddress()內(nèi)存管理MmMapIOSpace–MmUnmapIOSpaceHalAllocateCommonBufferI/O存取

XXXX=>UCHAR/USHORT/ULONGREAD_REGISTER_XXXXWRITE_REGISTER_XXXXREAD_PORT_XXXXWRITE_PORT_XXXX中斷架構(gòu)中斷只是異異常處理的的一部分在內(nèi)核代碼碼中被獲取取在恢復(fù)到用用戶態(tài)之間間進(jìn)行處理理但是硬件是是獨(dú)立于操操作系統(tǒng)的的CE使用二階段段中斷服務(wù)務(wù)模式少量的代碼碼進(jìn)行中斷斷的記錄調(diào)度中斷服服務(wù)程序代代碼進(jìn)行處處理操作系統(tǒng)提提供API來(lái)使能IRQ信號(hào),設(shè)置置中斷的優(yōu)優(yōu)先級(jí),等等等。與硬件有關(guān)關(guān)的操作在在OAL,以及設(shè)備驅(qū)驅(qū)動(dòng)代碼中中進(jìn)行。關(guān)于ISR與IST的一些解解釋IST是老的用戶戶模式代碼碼有完整的CE.NETAPI與CRT庫(kù)CE.NET調(diào)度程序根根據(jù)線程的的優(yōu)先級(jí)控控制IST的執(zhí)行運(yùn)行態(tài)綁定定到SYSINTR從異常處理理函數(shù)調(diào)用用ISR沒(méi)有操作系系統(tǒng)服務(wù)堆??臻g大大小有限可設(shè)置為可可重入的(在OAL進(jìn)行設(shè)置)MIPS,SHx匯編語(yǔ)言ISRIRQ優(yōu)先級(jí)的設(shè)設(shè)定依賴于于不同CPU的系統(tǒng)架構(gòu)構(gòu)在x86上由PIC硬件進(jìn)行設(shè)設(shè)置在MIPS上用OAL的IntrPriority,IntrMask進(jìn)行設(shè)置通過(guò)讓IST進(jìn)程推斷ISR服務(wù),OAL能夠增加實(shí)實(shí)時(shí)性。在CE3.0中,所有的的ISR代碼都是OAL的一部分沒(méi)有特殊的的擴(kuò)展IRQ綁定到OEMInit的事件ID沒(méi)有支持PNP,共享IRQ(PCI總線)CE.NET通過(guò)IRS(IISR)鏈解決了這這些限制。。CE.NET可安裝ISRCE3.0ISR架構(gòu)的首選選擴(kuò)展DLL代碼,在運(yùn)行時(shí)進(jìn)進(jìn)行綁定源代碼可以以是獨(dú)立于于CPU的一般用C編寫(xiě)有一些限制制不能調(diào)用CRT,WindowsAPI,或其它的DLL不可推斷的的ISR,或IST發(fā)布支持硬件共共IRQ共享從同一個(gè)IRQ關(guān)聯(lián)的不同同SYSINTRIDIISRCE.NET中斷處理內(nèi)核OAL驅(qū)動(dòng)硬件設(shè)置事件無(wú)中斷異常處函數(shù)ISR更高優(yōu)先級(jí)的中斷PSRSYSINTR_ID被屏蔽的IRQSYSINTR_xxSYSINTR_NOPISTIISR1NKCallIntChain(IRQ)IISRnSYSINTR_CHAINIISR2中斷服務(wù)線線程是內(nèi)置設(shè)備備的驅(qū)動(dòng)程程序的作戶戶態(tài)線程進(jìn)行實(shí)際的的中斷處理理調(diào)用CreateEvent創(chuàng)建一個(gè)與與邏輯中斷斷相關(guān)聯(lián)的的事件對(duì)象象IST在大多數(shù)時(shí)時(shí)間里都是是處于空閑閑狀態(tài),以以內(nèi)核用信信號(hào)通知事事件對(duì)象時(shí)時(shí)被喚醒IST通常運(yùn)行的的優(yōu)先級(jí)高高于普通優(yōu)優(yōu)先級(jí),其其優(yōu)先級(jí)由由CeSetThreadPriority函數(shù)設(shè)定中斷服務(wù)線線程InterruptInitialize調(diào)用InterruptInitialize將事件與ISR的中斷標(biāo)識(shí)識(shí)符關(guān)聯(lián)起起來(lái)WaitForSingleObject用來(lái)等待一一個(gè)用信號(hào)號(hào)通知的事事件這一調(diào)用通通常放在一一個(gè)循環(huán)中中,以使和和中斷處理理時(shí),IST可以回到這這一個(gè)調(diào)用用等待下一一個(gè)要處理理的中斷InterruptDone中斷數(shù)據(jù)處處理完以后后,IST必須調(diào)用InterruptDone函數(shù)使內(nèi)核使能能與這一個(gè)個(gè)線程相關(guān)關(guān)的中斷典型的IST啟動(dòng)structISTData//DeclaretheStrucuretopasstotheIST{HANDLEhThread;//ISTHandleDWORDsysIntr;//LogicalIDHANDLEhEvent;//handletotheeventtowaitforinterruptvolatileBOOLabort;//flagtotesttoexittheIST};ISTDatag_KeypadISTData;//CreateeventtolinktoISTg_KeypadISTData.hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);//TranslateIRQtoanlogicalID(x86CEPC)g_KeypadISTData.sysIntr=Mapirq2Sysintr(5);//startthethreadg_KeypadISTData.hThread=CreateThread(NULL,0,&KeypadIST,&g_KeypadISTData,0,NULL);典型的IST啟動(dòng)//ChangethethreadspriorityCeSetThreadPriority(g_KeypadISTData.hThread,0);//disconnectanypreviouseventfromlogicalIDInterruptDisable(g_KeypadISTData.sysIntr);//ConnectLogicalIDwithEventInterruptInitialize(g_KeypadISTData.sysIntr,g_KeypadISTData.hEvent,NULL,0);設(shè)置IST的優(yōu)先級(jí)與以前的事事件斷開(kāi)與ISR關(guān)聯(lián)典型的IST啟動(dòng)DWORDKeypadIST(void*dat){ISTData*pData=(ISTData*)dat;//loopuntiltoldtostopWhile(!pData->abort){//waitfortheinterruptevent...WaitForSingleObject(pData->hEvent,INFINITE)if(pData->abort)break;//Handletheinterrupt...//LetOSknowtheinterruptprocessingisdoneInterruptDone(pData->sysIntr);}Return0;}典型的IST結(jié)束//setabortflagtotruetoletthreadknow//thatitshouldexitg_KeypadISTData.abort=TRUE;//disconnecteventfromlogicalID//thisinternallysetsg_KeypadISTData.sysIntrwhichinturn//setsg_KeypadISTData.hEventthroughthekernelInterruptDisable(g_KeypadISTData.sysIntr);//waitforthreadtoexitWaitForSingleObject(g_KeypadISTData.hEvent,INFINITE);CloseHandle(g_KeypadISTData.hEvent);CloseHandle(g_KeypadISTData.hThread);設(shè)置一個(gè)會(huì)會(huì)導(dǎo)致IST退出的標(biāo)志志總線驅(qū)動(dòng)概概覽PCMCIAI82365(ISA)TI-1250(PCI)USBHost多主控制器器OHCI與UHCI(PCI)PCMCIAHostPCMCIA總線驅(qū)動(dòng)有有三個(gè)主要要的線程狀態(tài)改變線線程(卡的插入與與移除)中斷線程(處理卡的功功能性中斷斷請(qǐng)求)回調(diào)線程(通知事件相相關(guān)的設(shè)備備卡)總線驅(qū)動(dòng)支支持CardServ消息的一個(gè)個(gè)子集,從從回調(diào)線程程中用回調(diào)調(diào)函數(shù)發(fā)送送中斷以回調(diào)調(diào)的形式發(fā)發(fā)送到客戶戶端驅(qū)動(dòng)對(duì)新插入的的卡進(jìn)行掃掃描以確定定是否PnP元組,并與與注冊(cè)表中中的相關(guān)項(xiàng)項(xiàng)進(jìn)行比較較如果沒(méi)有發(fā)發(fā)現(xiàn)相匹配配的信息,,則候選的的驅(qū)動(dòng)程序序就運(yùn)行與與卡相關(guān)的的“detect”例程對(duì)卡進(jìn)進(jìn)行識(shí)別可能顯示出出一個(gè)對(duì)話話框詢問(wèn)DLL的名字USBHost兼容USB1.1版完全支持OHCI與UHCI支持所有的的傳輸類型型Isoch,bulk,interrupt,controlUSBD支持多個(gè)HC的復(fù)用總線設(shè)備驅(qū)驅(qū)動(dòng)典型地地采用LoadDriver進(jìn)行安裝,,使用USBD操作與HC進(jìn)行行通通信信總線線設(shè)設(shè)備備驅(qū)驅(qū)動(dòng)動(dòng)能能可可選選地地調(diào)調(diào)用用ActivateDeviceEx()以提提供供一一個(gè)個(gè)流流接接口口給給應(yīng)應(yīng)用用程程序序檢測(cè)測(cè)并并識(shí)識(shí)別別新新裝裝設(shè)設(shè)備備按照照注注冊(cè)冊(cè)表表中中的的描描述述安安裝裝驅(qū)驅(qū)動(dòng)動(dòng)可能能顯顯示示一一個(gè)個(gè)對(duì)對(duì)話話框框詢?cè)儐?wèn)問(wèn)DLL的名名字字OEM硬件件單塊塊驅(qū)驅(qū)動(dòng)動(dòng)(顯示示)GWE子系系統(tǒng)統(tǒng)設(shè)備備管管理理器器MDDPDDMDDPDDDDIDDSIDDSI編程程模模型型USB總線線設(shè)設(shè)備備驅(qū)驅(qū)動(dòng)動(dòng)HCDUSBDMDDPDD主要要內(nèi)內(nèi)容容概述述流驅(qū)驅(qū)動(dòng)動(dòng)接接口口設(shè)備備驅(qū)驅(qū)動(dòng)動(dòng)程程序序架架構(gòu)構(gòu)USBmouse驅(qū)動(dòng)動(dòng)開(kāi)開(kāi)發(fā)發(fā)示示例例WindowsCE系統(tǒng)統(tǒng)服服務(wù)務(wù)USB驅(qū)動(dòng)動(dòng)傳傳輸輸類類型型控制制傳傳輸輸U(kuò)SB打印印機(jī)機(jī),USB數(shù)碼碼相相機(jī)機(jī)同步步傳傳輸輸U(kuò)SB網(wǎng)絡(luò)絡(luò)電電話話中斷斷傳傳輸輸鼠標(biāo)標(biāo),鍵盤(pán)盤(pán),游戲戲控控制制器器批量量傳傳輸輸U(kuò)SB相機(jī)機(jī)必須須的的入入口口點(diǎn)點(diǎn)USBDeviceAttach當(dāng)設(shè)設(shè)備備掛掛接接時(shí)時(shí),,USB驅(qū)動(dòng)動(dòng)模模塊塊調(diào)調(diào)用用這這個(gè)個(gè)函函數(shù)數(shù)USBInstallDriver當(dāng)一一個(gè)個(gè)不不明明設(shè)設(shè)備備掛掛接接到到USB上時(shí)時(shí),,USB驅(qū)動(dòng)動(dòng)模模塊塊調(diào)調(diào)用用這這個(gè)個(gè)函函數(shù)數(shù)USBUnInstallDriver總線線設(shè)設(shè)備備驅(qū)驅(qū)動(dòng)動(dòng)能能調(diào)調(diào)用用這這個(gè)個(gè)函函數(shù)數(shù)從從USB驅(qū)動(dòng)動(dòng)注注消消USB鼠標(biāo)標(biāo)模模型型usbd.dllUSB鼠標(biāo)驅(qū)動(dòng)硬件應(yīng)用演示示:USB鼠標(biāo)標(biāo)驅(qū)驅(qū)動(dòng)動(dòng)代代碼碼主要要內(nèi)內(nèi)容容概述述流驅(qū)驅(qū)動(dòng)動(dòng)接接口口設(shè)備備驅(qū)驅(qū)動(dòng)動(dòng)程程序序架架構(gòu)構(gòu)USBmouse驅(qū)動(dòng)動(dòng)開(kāi)開(kāi)發(fā)發(fā)示示例例WindowsCE系統(tǒng)統(tǒng)服服務(wù)務(wù)系統(tǒng)統(tǒng)服服務(wù)務(wù)的的概概念念與與歷歷史史在WindowsCE4.0以前前,沒(méi)沒(méi)有有系系統(tǒng)統(tǒng)服服務(wù)務(wù)所謂謂的的“設(shè)備備驅(qū)驅(qū)動(dòng)動(dòng)”被寫(xiě)寫(xiě)成成一一個(gè)個(gè)工工作作區(qū)區(qū)在WindowsCE4.0以后后,引引入入了了系系統(tǒng)統(tǒng)服服務(wù)務(wù)管管理理器器系統(tǒng)統(tǒng)服服務(wù)務(wù)注注冊(cè)冊(cè)系統(tǒng)統(tǒng)服服務(wù)務(wù)體體系系架架構(gòu)構(gòu)CE的系系統(tǒng)統(tǒng)服服務(wù)務(wù)是是一一個(gè)個(gè)DLL,,這個(gè)個(gè)DLL的構(gòu)構(gòu)建建幾幾乎乎與與流流設(shè)設(shè)備備驅(qū)驅(qū)動(dòng)動(dòng)一一模模一一樣樣與流流設(shè)設(shè)備備驅(qū)驅(qū)動(dòng)動(dòng)一一樣樣,,WindowsCE系統(tǒng)統(tǒng)服服務(wù)務(wù)提提供供同同樣樣的的10個(gè)個(gè)入入點(diǎn)點(diǎn)口口,,從從xxx_Init到xxx_PowerDown系統(tǒng)統(tǒng)服服務(wù)務(wù)有有三三個(gè)個(gè)前前綴綴字字符符系統(tǒng)統(tǒng)服服務(wù)務(wù)IOCTL命令令I(lǐng)OCTL_SERVICE_STARTIOCTL_SERVICE_STOPIOCTL_SERVICE_REFRESHIOCTL_SERVICE_INSTALLIOCTL_SERVICE_STATUSIOCTL_SERVICE_SUPPORTED_OPTIONS系統(tǒng)統(tǒng)服服務(wù)務(wù)的的應(yīng)應(yīng)用用控控制制ActivateServiceRegisterServiceGetServiceHandleServiceIoControlDeregisterService作業(yè)業(yè)讀Service.exe的在在線線幫幫助助,,自自已已實(shí)實(shí)現(xiàn)現(xiàn)關(guān)關(guān)于于WindowsCE的系系統(tǒng)統(tǒng)服服務(wù)務(wù)。。應(yīng)用用程程序序發(fā)發(fā)送送I/O控制制命命令令,,然然后后服服務(wù)務(wù)例例程程將將當(dāng)當(dāng)前前時(shí)時(shí)間間寫(xiě)寫(xiě)到到日日志志文文件件9、靜夜夜四無(wú)無(wú)鄰,,荒居居舊業(yè)業(yè)貧。。。12月月-2212月月-22Tuesday,December20,202210、雨雨中中黃黃葉葉樹(shù)樹(shù),,燈燈下下白白頭頭人人。。。。03:45:0903:45:0903:4512/20/20223:45:09AM11、以以我我獨(dú)獨(dú)沈沈久久,,愧愧君君相相見(jiàn)見(jiàn)頻頻。。。。12月月-2203:45:0903:45Dec-2220-Dec-2212、故故人人江江海海別別,,幾幾度度隔隔山山川川。。。。03:45:0903:45:0903:45Tuesday,December20,202213、乍見(jiàn)翻翻疑夢(mèng),,相悲各各問(wèn)年。。。12月-2212月-2203:45:0903:45:09December20,202214、他鄉(xiāng)生生白發(fā),,舊國(guó)見(jiàn)見(jiàn)青山。。。20十十二月20223:45:09上午午03:45:0912月-2215、比不了了得就不不比,得得不到的的就不要要。。。十二月223:45上午午12月-2203:45December20,202216、行動(dòng)出成果果,工作出財(cái)財(cái)富。。2022/12/203:45:0903:45:0920December202217、做前,能夠夠環(huán)視四周;;做時(shí),你只只能或者最好好沿著以腳為為起點(diǎn)的射線線向前。。3:45:09上午3:45上上午03:45:0912月-229、沒(méi)沒(méi)有有失失敗敗,,只只有有暫暫時(shí)時(shí)停停止止成成功功??!。。12月月-2212月月-22Tuesday,December20,202210、很很多多事事情情努努力力了了未未必必有有結(jié)結(jié)果果,,但但是是不不努努力力卻卻什什么么改改變變也也沒(méi)沒(méi)有有。。。。03:45:0903:45:0903:4512/20/20223:45:09AM11、成成功功就就是是日日復(fù)復(fù)一一日日

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論