第13章:WinCE驅(qū)動開發(fā)與設(shè)備管理_第1頁
第13章:WinCE驅(qū)動開發(fā)與設(shè)備管理_第2頁
第13章:WinCE驅(qū)動開發(fā)與設(shè)備管理_第3頁
第13章:WinCE驅(qū)動開發(fā)與設(shè)備管理_第4頁
第13章:WinCE驅(qū)動開發(fā)與設(shè)備管理_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

嵌入式操作系統(tǒng)第十三章WinCE驅(qū)動開發(fā)與設(shè)備管理戚隆寧longn_qi@WinCE驅(qū)動開發(fā)與設(shè)備管理驅(qū)動程序背景知識WinCE5.0的驅(qū)動程序WinCE5.0的電源管理(一)驅(qū)動程序背景知識什么是驅(qū)動程序顧名思義,驅(qū)使硬件(虛擬硬件)動作的程序?qū)τ布M行配置對硬件進行控制與硬件進行通信為系統(tǒng)進行硬件功能抽象(一)驅(qū)動程序背景知識關(guān)于驅(qū)動程序的認識誤區(qū)驅(qū)動程序只存在于操作系統(tǒng)中驅(qū)動程序的“技術(shù)含量”高于應(yīng)用程序驅(qū)動程序沒啥“技術(shù)含量”,無非是配配寄存器(一)驅(qū)動程序背景知識關(guān)于驅(qū)動程序的認識誤區(qū)驅(qū)動程序只存在于操作系統(tǒng)中intmain()//一個前后臺系統(tǒng)的例子{ …

UartInit();

InterruptInit(); while(!UartDataReady); for(i=0;i<UART_FIFO_LENGTH;i++) { *(DataBuf+i)=ReadDataUart(); } …}討論:這些是驅(qū)動程序嗎?(一)驅(qū)動程序背景知識關(guān)于驅(qū)動程序的認識誤區(qū)驅(qū)動程序的“技術(shù)含量”高于應(yīng)用程序驅(qū)動程序沒啥“技術(shù)含量”,無非是配配寄存器這兩種看法都是片面的,無論是驅(qū)動程序還是應(yīng)用程序,都是算法+數(shù)據(jù)結(jié)構(gòu),設(shè)計好的程序?qū)﹂_發(fā)者都是挑戰(zhàn)然而對開發(fā)者的要求的確有所不同,設(shè)計時考慮的角度也有所區(qū)別,程序功能面向的對象也不一樣(一)驅(qū)動程序背景知識編寫驅(qū)動程序應(yīng)具備的基本知識了解驅(qū)動程序所“驅(qū)動”的硬件了解驅(qū)動程序所需要“服務(wù)”的系統(tǒng)了解中斷、DMA、內(nèi)存管理等與硬件操作相關(guān)的基礎(chǔ)機制硬件驅(qū)動系統(tǒng)(一)驅(qū)動程序背景知識編寫驅(qū)動程序應(yīng)具備的基本知識了解驅(qū)動程序所“驅(qū)動”的硬件USBDriversSDIODriversNetworkingDriversStorageDriversDisplayDriversUserInputDrivers(keypad,touch)AudioDriversSerialDriversBatteryDriversBluetoothDrivers…(一)驅(qū)動程序背景知識編寫驅(qū)動程序應(yīng)具備的基本知識了解驅(qū)動程序所需要“服務(wù)”的系統(tǒng)如果是前后臺系統(tǒng),需要由程序員自己考慮驅(qū)動程序的架構(gòu)及驅(qū)動程序與系統(tǒng)的接口如果在操作系統(tǒng)中,需要按照操作系統(tǒng)中驅(qū)動的架構(gòu)及驅(qū)動與操作系統(tǒng)的接口開發(fā)(一)驅(qū)動程序背景知識編寫驅(qū)動程序應(yīng)具備的基本知識了解中斷、DMA、內(nèi)存管理等與硬件操作相關(guān)的基礎(chǔ)機制如果是前后臺系統(tǒng),需要由程序員自己設(shè)計中斷服務(wù)程序、完成DMA操作、分配內(nèi)存如果在操作系統(tǒng)中,需要采用操作系統(tǒng)提供的相關(guān)機制進行操作(二)WinCE5.0的驅(qū)動程序WinCE5.0驅(qū)動程序概述驅(qū)動程序在WinCE5.0體系結(jié)構(gòu)中屬于OEM層OEM(OriginalEquipmentManufacturer,原始設(shè)備制造商)OEM可根據(jù)自己產(chǎn)品的硬件特點對WindowsCE進行定制,從而使WindowsCE可以運行在這些廠商的設(shè)備上在出售硬件的同時,也會把OEM層以BSP的形式提供給開發(fā)者使用體現(xiàn)了WinCE5.0對硬件的適配對體系結(jié)構(gòu)的適配對硬件設(shè)備的適配(二)WinCE5.0的驅(qū)動程序WinCE5.0驅(qū)動程序概述驅(qū)動程序在WinCE5.0體系結(jié)構(gòu)中(二)WinCE5.0的驅(qū)動程序WinCE5.0驅(qū)動程序概述驅(qū)動程序在WinCE5.0體系結(jié)構(gòu)中(二)WinCE5.0的驅(qū)動程序WinCE5.0驅(qū)動程序概述WinCE5.0中驅(qū)動程序的主要特點驅(qū)動程序?qū)崿F(xiàn)對硬件的配置、控制、數(shù)據(jù)的讀寫通過系統(tǒng)調(diào)用向應(yīng)用程序提供接口(絕大多數(shù)情況下為文件操作系統(tǒng)調(diào)用)驅(qū)動程序在WinCE5.0中表現(xiàn)為動態(tài)鏈接庫(dll),被設(shè)備管理器進程(或GWES)加載,運行于用戶態(tài)(二)WinCE5.0的驅(qū)動程序WinCE5.0驅(qū)動程序概述WinCE5.0中驅(qū)動程序的主要特點通過內(nèi)核態(tài)的ISR和驅(qū)動程序中特定的中斷服務(wù)線程(IST)處理中斷可以有多個線程,采用WinCE5.0操作系統(tǒng)提供的機制進行線程間的同步采用WinCE5.0操作系統(tǒng)的機制分配內(nèi)存(二)WinCE5.0的驅(qū)動程序WinCE5.0驅(qū)動的宿主WinCE5.0中驅(qū)動程序表現(xiàn)形式為Dll,因此不能獨立運行,必須被加載到某個進程空間(二)WinCE5.0的驅(qū)動程序單體驅(qū)動與分層驅(qū)動單體驅(qū)動

所有的驅(qū)動程序代碼,包括中斷、I/O操作、對硬件的控制、資源分配等全部放在一起,與傳統(tǒng)驅(qū)動開發(fā)方式類似分層驅(qū)動 分為兩層,上面一層叫模型設(shè)備驅(qū)動(ModelDeviceDriver,MDD),下面一層叫平臺相關(guān)驅(qū)動(PlatformDependenceDriver,PDD)無論是單體驅(qū)動還是分層驅(qū)動都向宿主導出DDI接口(二)WinCE5.0的驅(qū)動程序單體驅(qū)動與分層驅(qū)動單體驅(qū)動的特點內(nèi)部不分層,包含與驅(qū)動硬件直接相關(guān)的代碼,程序效率高,可移植性差簡單驅(qū)動采用此種模型結(jié)構(gòu)較為清晰分層驅(qū)動的特點MDD層為針對某一類硬件的共性代碼,PDD層為針對特定硬件的專用代碼MDD與PDD之間通過DDSI(DeviceDriverServiceproviderInterface)接口實現(xiàn)調(diào)用可移植性強,針對不同硬件只需修改PDD,但由于存在DDSI調(diào)用,效率會有所降低(二)WinCE5.0的驅(qū)動程序單體驅(qū)動與分層驅(qū)動分層驅(qū)動的MDD與PDDMDD層通常有如下特性:包含某一類驅(qū)動的通用代碼,代碼可重用生成的Lib庫可與不同的PDD庫鏈接調(diào)用PDD層訪問硬件,定義PDD層的DDSI函數(shù),并在代碼中使用提供DDI接口供操作系統(tǒng)訪問進行中斷處理,中斷處理線程IST通常位于這一層通常無需改動PDD層通常有如下特性:包含與某款硬件相關(guān)的代碼只能與一類MDD協(xié)同工作實現(xiàn)MDD的DDSI接口建議盡可能采用分層驅(qū)動模型, 結(jié)構(gòu)清晰,可移植性強, 除非對驅(qū)動效率要求極高MDD與PDD只是在代碼上的邏輯劃分, 在運行時是沒有這種層次關(guān)系的(二)WinCE5.0的驅(qū)動程序WinCE5.0的驅(qū)動接口類型本地設(shè)備驅(qū)動對操作系統(tǒng)宿主有一個定制的接口,同時為特定類型的所有設(shè)備都給出了一組標準的功能。例如GWES所加載的顯示屏、鍵盤驅(qū)動等流式接口驅(qū)動適用于輸入輸出二進制流數(shù)據(jù)的設(shè)備,因此將設(shè)備抽象為文件,驅(qū)動向宿主導出較為標準的接口,而應(yīng)用程序通過文件訪問系統(tǒng)調(diào)用函數(shù)訪問驅(qū)動驅(qū)動向宿主導出的接口與文件訪問系統(tǒng)調(diào)用函數(shù)有一定的對應(yīng)關(guān)系是驅(qū)動中最為常見的類型,主要由設(shè)備管理器宿主(Device.exe)加載混合設(shè)備驅(qū)動既導出定制的本地接口,又導出流接口。如:USB鼠標等無論哪種都是DDI接口重點需要掌握的是流式接口驅(qū)動?。ǘ¦inCE5.0的驅(qū)動程序流式接口驅(qū)動很多硬件設(shè)備都在不斷地制造或使用二進制數(shù)據(jù),這些設(shè)備可被抽象成流式設(shè)備WinCE提供流式接口驅(qū)動程序管理流式設(shè)備。任何暴露流式接口函數(shù)的驅(qū)動程序都可被稱為流式接口驅(qū)動程序(把流式接口函數(shù)作為DLL的導出函數(shù))在流式接口驅(qū)動程序中,驅(qū)動程序負責把外設(shè)抽象成一個文件,而應(yīng)用程序則使用操作系統(tǒng)提供的文件API對外設(shè)進行訪問(二)WinCE5.0的驅(qū)動程序流式接口驅(qū)動使用示例對串口設(shè)備的訪問打開設(shè)備:HANDLEhComm;hComm=CreateFile(TEXT(“COM1:”),GENERIC_READ|GENERIC_WRITE, 0,NULL,OPEN_EXISTING,0,NULL);寫數(shù)據(jù):INTrc;DWORDcBytes;BYTEch;ch=TEXT(‘a(chǎn)’);rc=WriteFile(hComm,&ch,1,&cBytes,NULL);設(shè)備名(二)WinCE5.0的驅(qū)動程序流式接口驅(qū)動流式接口函數(shù)(向宿主導出)函數(shù)名對應(yīng)的文件操作API功能簡述XXX_Open()CreateFile()打開設(shè)備以進行操作XXX_Close()CloseHandle()關(guān)閉設(shè)備XXX_Init()初始化設(shè)備,加載時調(diào)用XXX_Deinit()釋放設(shè)備,卸載時調(diào)用XXX_Read()ReadFile()從設(shè)備中讀取數(shù)據(jù)XXX_Write()WriteFile()向設(shè)備中寫入數(shù)據(jù)XXX_Seek()SetFilePointer()移動設(shè)備中的數(shù)據(jù)指針XXX_IOControl()DeviceIOControl()對設(shè)備發(fā)送控制命令XXX_PowerUp()從掛起恢復時調(diào)用XXX_PowerDown()設(shè)備關(guān)閉自身電源XXX_PreClose()通知驅(qū)動程序把打開的句柄設(shè)置為效XXX_PreDeinit()通知程序把設(shè)備句柄設(shè)置為無效XXX為設(shè)備名前綴(二)WinCE5.0的驅(qū)動程序流式接口驅(qū)動XXX_Init()與XXX_Deinit()XXX_Init是驅(qū)動程序的動態(tài)庫被成功裝載后第一個被調(diào)用的函數(shù)(被宿主調(diào)用),驅(qū)動程序應(yīng)當在這個函數(shù)中初始化硬件(如動態(tài)申請邏輯中斷號、虛擬地址映射等)。當這個函數(shù)成功返回,設(shè)備管理器對這個程序就不做進一步處理,至此一個各為XXX的設(shè)備就已經(jīng)加載成功(等待打開操作)XXX_Deinit函數(shù)在設(shè)備被卸載時調(diào)用,它實現(xiàn)與XXX_Init相反的操作,主要為釋放前者占用的所有系統(tǒng)資源(二)WinCE5.0的驅(qū)動程序流式接口驅(qū)動XXX_Open()與XXX_Close()當用戶程序調(diào)用CreateFile打開設(shè)備時,設(shè)備管理器就會調(diào)用此驅(qū)動程序的XXX_Open函數(shù),一般在此函數(shù)中完成設(shè)備資源的申請當用戶程序調(diào)用CloseHandle關(guān)閉設(shè)備時,XXX_Close函數(shù)就會被設(shè)備管理器調(diào)用,它應(yīng)該做與XXX_Open相反的事情,具體包括:釋放XXX_Open分配的內(nèi)存,將驅(qū)動程序被打開的次數(shù)減少等(二)WinCE5.0的驅(qū)動程序流式接口驅(qū)動

XXX_Read()、XXX_Write()與XXX_Seek()它們對設(shè)備進行讀、寫和移動指針的操作。有些設(shè)備與應(yīng)用的交互是單向的,只需要寫入或讀取數(shù)據(jù),因此并不是所有的流式接口設(shè)備都需要這三個接口。

XXX_PowerUp()與XXX_PowerDown()電源管理接口,在電源管理部分講解(二)WinCE5.0的驅(qū)動程序流式接口驅(qū)動

XXX_IOControl() BOOLXXX_IOControl( DWORDhDeviceContext, DWORDdwCode, PBYTEpBufIn, DWORDdwLenIn, PBYTEpBufOut, DWORDdwLenOut, PDWORDpdwActualOut );幾乎可以說一個驅(qū)動程序的所有功能都可以在這個函數(shù)中實現(xiàn)。當實現(xiàn)一個自定義的設(shè)備時,可以隨心所欲定義自已的IO操作。一些不適于像文件一樣進行讀/寫的設(shè)備,都可通過XXX_IOControl()函數(shù)控制。(二)WinCE5.0的驅(qū)動程序流式接口驅(qū)動流式接口驅(qū)動的工作流程(二)WinCE5.0的驅(qū)動程序流式接口驅(qū)動流式接口驅(qū)動的工作流程流式驅(qū)動程序工作流程詳述如下:(1)加載驅(qū)動程序。(2)設(shè)備管理器從注冊表的dll鍵值中獲取驅(qū)動程序所在的DLL文件名。(3)設(shè)備管理器調(diào)用LoadDriver()函數(shù)把XXX.dll加載到自己的虛擬地址空間。(4)設(shè)備管理器在注冊表記錄所有已經(jīng)加載的驅(qū)動程序記錄。(5)設(shè)備管理器調(diào)用驅(qū)動的XXX_init函數(shù),對硬件進行基本初始化。經(jīng)過上面的步驟,驅(qū)動成功加載。下面是對驅(qū)動程序的操作:(6)應(yīng)用程序必須先使用CreateFile打開該設(shè)備。(7)設(shè)備管理器調(diào)用驅(qū)動的XXX_open()打開設(shè)備。(8)設(shè)備成功打開后,就可以進行讀、寫和控制操作。(9)當應(yīng)用程序不再使用該設(shè)備時,調(diào)用CloseHandle()將設(shè)備關(guān)閉。(10)當系統(tǒng)不再使用該設(shè)備時,應(yīng)用程序調(diào)用DeactivateDevice()卸載驅(qū)動程序。(二)WinCE5.0的驅(qū)動程序流式接口驅(qū)動將流式接口驅(qū)動加入系統(tǒng)(BSP)為流式接口驅(qū)動選擇一個設(shè)備名前綴實現(xiàn)驅(qū)動需要的接口函數(shù)配置相關(guān)文件和注冊表加入系統(tǒng)鏡像(二)WinCE5.0的驅(qū)動程序流式接口驅(qū)動將流式接口驅(qū)動加入系統(tǒng)(BSP)為流式接口驅(qū)動選擇一個設(shè)備名前綴這里采用由3個大寫的英文字母,加一個0-9之間的數(shù)字構(gòu)成的傳統(tǒng)方式命名。如:一般打印機設(shè)備由特殊文件名“LPTx:”來表示,而串口由特殊文件名“COMx”來表示。以打印機為例,前綴選擇為“LPT”實現(xiàn)驅(qū)動需要的接口函數(shù)可以實現(xiàn)全部或部分接口函數(shù)(二)WinCE5.0的驅(qū)動程序流式接口驅(qū)動將流式接口驅(qū)動加入系統(tǒng)(BSP)配置相關(guān)文件和注冊表

設(shè)置相關(guān)文件和注冊表,使得可以在系統(tǒng)中添加自己的驅(qū)動程序在platform/BSP/drivers下新建一個目錄,然后在drivers目錄中的dirs文件中加入以你剛新建的目錄名。在剛新建的目錄下,放入驅(qū)動程序代碼和sources,makefile,mydev.def文件配置注冊表(二)WinCE5.0的驅(qū)動程序流式接口驅(qū)動將流式接口驅(qū)動加入系統(tǒng)(BSP)配置相關(guān)文件和注冊表makefile:只需要一行!INCLUDE$(_MAKEENVROOT)\makefile.def

mydev.def:定義需要輸出的函數(shù),這些函數(shù)能被其它代碼用動態(tài)加載的方法調(diào)用。格式:LIBRARY

MyDev(這個字符串要和將要生成的動態(tài)庫的文件名一樣)EXPORTS

LPT_Init

LPT_Deinit

LPT_Open

LPT_Close

LPT_PowerOff

LPT_PowerDown

LPT_IOControl(二)WinCE5.0的驅(qū)動程序流式接口驅(qū)動將流式接口驅(qū)動加入系統(tǒng)(BSP) 配置相關(guān)文件和注冊表

Sources:這個文件很重要,內(nèi)容也多,最基本的一個文件該有如下內(nèi)容:TARGETNAME=MyDev

(指定要生成的動態(tài)庫的名稱)TARGETTYPE=DYNLINK(指定要生成的是一個動態(tài)庫)TARGETLIBS=$(_COMMONSDKROOT)\lib\$(_CPUINDPATH)\coredll.libSOURCELIBS=$(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\ceddk.lib\DEFFILE=MyDev.def(指定def文件)DLLENTRY=DllEntry

(指定動態(tài)庫的入口函數(shù))

SOURCES=(所有源文件名字)(二)WinCE5.0的驅(qū)動程序流式接口驅(qū)動將流式接口驅(qū)動加入系統(tǒng)(BSP) 配置相關(guān)文件和注冊表

在注冊表中添加如下項目:[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\MyDev]

"Prefix"=“LPT"

"Dll"="MyDev.Dll"

"Order"=dword:1驅(qū)動程序可以正確地被設(shè)備管理器加載。(二)WinCE5.0的驅(qū)動程序流式接口驅(qū)動將流式接口驅(qū)動加入系統(tǒng)(BSP) 將驅(qū)動Dll加入系統(tǒng)鏡像

加入BIB文件:MODULES;NamePathMemoryType;MyDev.dll

$(_FLATRELEASEDIR)\MyDev.dll

NK

SH(二)WinCE5.0的驅(qū)動程序驅(qū)動程序的中斷處理物理中斷與邏輯中斷物理中斷: 設(shè)備可以通過信號線向微處理器發(fā)出中斷信號,從而請求相應(yīng)的中斷服務(wù)。微處理器通過對代表各個中斷源的信號線進行編號即得到物理中斷號。同樣的設(shè)備在不同的微處理器和不同的硬件平臺上表現(xiàn)出不同的物理中斷號。物理中斷號在WinCE中通常以IRQ表示邏輯中斷: 對物理中斷的一種映射,由WinCE以及OEM根據(jù)一定規(guī)范,為不同的外圍設(shè)備定義相應(yīng)的唯一的標識符,即為邏輯中斷號。邏輯中斷號可以獨立于不同的處理器和硬件平臺,以使WinCE保持良好的硬件平臺無關(guān)性。邏輯中斷號在WinCE中以SYSINTR表示前綴邏輯中斷在WinCE中體現(xiàn)了對硬件物理中斷的抽象,可以使驅(qū)動的中斷處理具有一定的硬件無關(guān)性(二)WinCE5.0的驅(qū)動程序驅(qū)動程序的中斷處理物理中斷與邏輯中斷OAL須把物理中斷映射成邏輯中斷,然后供操作系統(tǒng)和驅(qū)動程序使用 在驅(qū)動中實現(xiàn)IRQ和SYSINTR的映射:靜態(tài)定義#defineIRQ_USBH26#defineSYSINTR_OHCI(SYSINTR_FIRMWARE+1)//17,前16為系統(tǒng)內(nèi)部使用

OALIntrStaticTranslate(SYSINTR_OHCI,IRQ_USBH);//OAL中動態(tài)申請if(!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR,&Irq,sizeof(Irq),&gIntrTouch,sizeof(UINT32),NULL)){

gIntrTouch=SYSINTR_UNDEFINED;

return(FALSE);}(二)WinCE5.0的驅(qū)動程序驅(qū)動程序的中斷處理ISR-IST模型中斷處理包括ISR和IST兩個部分內(nèi)核模式中斷服務(wù)例程(InterruptServerRoutine,ISR)用戶模式中斷服務(wù)線程(InterruptServerThread,IST)(二)WinCE5.0的驅(qū)動程序驅(qū)動程序的中斷處理ISR-IST模型ISR是集成在內(nèi)核(OAL)中的一段代碼提供了對特定物理中斷(IRQ)的第一響應(yīng)為IST的執(zhí)行保存必要的數(shù)據(jù)將物理中斷轉(zhuǎn)化為邏輯中斷通知內(nèi)核調(diào)用相應(yīng)的中斷服務(wù)線程為保證系統(tǒng)的實時性,代碼非常緊湊,運行時間很短(二)WinCE5.0的驅(qū)動程序驅(qū)動程序的中斷處理ISR-IST模型IST通過創(chuàng)建一個事件對象與邏輯中斷關(guān)聯(lián)負責處理特定中斷的大部分工作運行在用戶態(tài),但具有較高的優(yōu)先級可以被一個進程或驅(qū)動程序創(chuàng)建與系統(tǒng)其他線程共同參與操作系統(tǒng)調(diào)度處理完成時,應(yīng)通知內(nèi)核再次開啟相應(yīng)的硬件中斷(二)WinCE5.0的驅(qū)動程序驅(qū)動程序的中斷處理ISR-IST模型ISR-IST中斷處理模型(二)WinCE5.0的驅(qū)動程序驅(qū)動程序的中斷處理ISR-IST模型ISR必須完成中斷所需的最少工作:ISR清除該設(shè)備上的中斷條件ISR向內(nèi)核返回一個SYSINTR調(diào)度等待的IST以執(zhí)行中斷操作大多數(shù)工作交給IST去完成:使用CreateEvent()函數(shù)創(chuàng)建一個Event內(nèi)核對象使用InterruptInitialize()把Event與一個邏輯中斷關(guān)聯(lián)在Event對象上使用WaitForSingleObject()來等待中斷產(chǎn)生中斷結(jié)束后,必須調(diào)用InterruptDone()來完成本次中斷處理(二)WinCE5.0的驅(qū)動程序驅(qū)動程序的中斷處理中斷處理過程(二)WinCE5.0的驅(qū)動程序驅(qū)動程序的中斷處理中斷處理過程(1)一個硬件產(chǎn)生中斷時,它被發(fā)送到內(nèi)核的異常處理器(ExceptionHandler),內(nèi)核處理這個異常;(2)異常處理器調(diào)用OAL函數(shù)OEMInterruptDisable,通知硬件屏蔽全部中斷;(3)ISR向內(nèi)核返回系統(tǒng)邏輯中斷號,之前打開高優(yōu)先級中斷號;(4)內(nèi)核中的中斷服務(wù)處理器(InterruptServiceHandler)接受該邏輯中斷號并進行后續(xù)的處理。一種是什么也不做(SYSINTR_NOP),一種是觸發(fā)IST(SYSINTR_xxx),另一種是時間片重新調(diào)度(SYSINTR_RESHED);(5)內(nèi)核判斷出了中斷源,打開此中斷源之外的所有中斷;(6)內(nèi)核觸發(fā)它的中斷支持處理器來觸發(fā)喚醒IST并完成它的工作;(7)IST完成中斷處理后,調(diào)用InterruptDone()函數(shù)通知內(nèi)核;(8)內(nèi)核調(diào)用OEMInterruptDone完成這個中斷所有處理,OAL函數(shù)通知硬件重新開啟這個中斷。(二)WinCE5.0的驅(qū)動程序驅(qū)動程序的中斷處理中斷程序中的線程間通信中斷線程IST運行在用戶態(tài),因此可正常使用WinCE中的線程間通信方式互斥體;信號量;事件;消息方法;臨界區(qū);互鎖函數(shù)(二)WinCE5.0的驅(qū)動程序驅(qū)動程序的內(nèi)存訪問驅(qū)動經(jīng)常需要訪問物理地址,對于驅(qū)動程序來說,設(shè)備的物理基地址空間必須映射到虛擬內(nèi)存地址空間,才能實現(xiàn)驅(qū)動程序?qū)υO(shè)備的訪問內(nèi)存管理函數(shù)VirtualAlloc()負責在虛擬內(nèi)存空間保留一段虛擬內(nèi)存VirtualCopy()負責把一段物理內(nèi)存和虛擬內(nèi)存綁定VirtualFree()負責釋放所申請的虛擬內(nèi)存(二)WinCE5.0的驅(qū)動程序驅(qū)動程序的內(nèi)存訪問例子: 使用VirtualAlloc函數(shù)在虛擬地址空間中為一個設(shè)備驅(qū)動保留4KB的內(nèi)存塊,并返回一個指向這個內(nèi)存塊的指針pVirtualAddr:

pVirtualAddr=(unsigned*)VirtualAlloc(0,0x1000,MEM_RESERVE,//PAGE_NOACCESS); 再使用VirtualCopy函數(shù)將上面保留的4KB內(nèi)存塊與設(shè)備物理基地址對應(yīng):

nTmpVal=VirtualCopy(

pVirtualAddr,(LPVOID)((PhyAddress<<4)/256),0x1000,PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL);(二)WinCE5.0的驅(qū)動程序驅(qū)動程序的內(nèi)存訪問DMA傳輸時的緩沖區(qū)分配 需要為DMA傳輸分配一塊緩沖區(qū),這塊緩沖區(qū)必須是連續(xù)的物理內(nèi)存。在WinCE中,有兩種方法可以分配DMA緩沖區(qū)

1.使用CEDDK函數(shù)(微軟建議.調(diào)用內(nèi)核函數(shù))HalAllocateCommonBuffer():分配緩沖區(qū),成功返回緩沖區(qū)的虛擬地址HalFreeCommonBuffer():釋放HalAllocateCommonBuffer申請的內(nèi)存。HalTranslateSystemAddress():把物理內(nèi)存地址轉(zhuǎn)化為總線相關(guān)的邏輯內(nèi)存地址,然后參數(shù)直接傳遞給DMA控制器使用。

2.使用內(nèi)核函數(shù)AllocPhysMem():申請連續(xù)物理內(nèi)存,成功則返回對應(yīng)的虛擬地址。FreePhysMem():釋放AllocPhysMem申請的內(nèi)存。(二)WinCE5.0的驅(qū)動程序驅(qū)動的加載絕大多數(shù)驅(qū)動都是通過設(shè)備管理器加載的(二)WinCE5.0的驅(qū)動程序驅(qū)動的加載資源管理器系統(tǒng)資源包括IRQ和I/O,是由系統(tǒng)注冊表配置和定義的。資源管理器跟蹤可用的系統(tǒng)資源,管理驅(qū)動程序加載時資源的請求與分配,避免系統(tǒng)的資源沖突總線枚舉器由Device.exe加載,通過讀取注冊表入口來查找新設(shè)備。掃描注冊表root下的子鍵,加載更多的總線和設(shè)備(三)WinCE5.0的電源管理電源管理器系統(tǒng)利用電源管理器實現(xiàn)電源管理電源管理器負責管理設(shè)備電源狀態(tài),它提供下列支持:設(shè)備可以自己管理電源供應(yīng)實現(xiàn)電源的宏觀控制(系統(tǒng))和微觀控制(設(shè)備)

用戶可實施自己的電源管理策略

被Device.exe加載(三)WinCE5.0的電源管理電源管理器電源管理模塊是以動態(tài)連接庫的形式存在于系統(tǒng)中的,稱為Pm.dll,是Device.exe的加載對象之一為了獲得電源管理功能,必須通過PlatformBuilder將電源管理組件編譯到內(nèi)核鏡像中:(三)WinCE5.0的電源管理設(shè)備電源狀態(tài)和系統(tǒng)電源狀態(tài)WinCE提供五種預定義的設(shè)備電源狀態(tài):D0,D1,D2,D3,D4,它們在注冊表中也有相對應(yīng)的鍵,如下表所示:設(shè)備電源狀態(tài)注冊表鍵描述FullOnD0電源完全開啟LowOnD1低電源或低性能下提供完全功能StandyD2部分供電,等待喚醒請求SleepD3睡眠,提供喚醒的最小電流OffD4未供電所有設(shè)備都必須支持的設(shè)備電源狀態(tài)是全開狀態(tài)D0一般,驅(qū)動程序在加載時把設(shè)備電源狀態(tài)設(shè)置成D0,卸載時設(shè)置成D4(三)WinCE5.0的電源管理設(shè)備電源狀態(tài)和系統(tǒng)電源狀態(tài)設(shè)備電源狀態(tài)和系統(tǒng)電源狀態(tài)在common.reg文件中,定義了默認的系統(tǒng)電源狀態(tài):系統(tǒng)電源狀態(tài)描述On用戶主動使用設(shè)備UserIdle用戶與設(shè)備停止交互,但有可能仍然使用設(shè)備SystemIdle

UserIdle一段時間后進入此狀態(tài),但驅(qū)動和系統(tǒng)進程仍然活動Suspend驅(qū)動和系統(tǒng)進程不再與系統(tǒng)交互時進入此狀態(tài)ColdReboot和Reboot冷啟動系統(tǒng)(三)WinCE5.0的電源管理設(shè)備電源狀態(tài)和系統(tǒng)電源狀態(tài)系統(tǒng)電源狀態(tài)代表了設(shè)備電源狀態(tài)的不同組合(三)WinCE5.0的電源管理驅(qū)動程序與電源管理器的交互(三)WinCE5.0的電源管理驅(qū)動程序與電源管理器的交互電源管理器通過IOCTL代碼來和驅(qū)動通信 通常情況下,當一個驅(qū)動程序聲明為支持電源管理時,驅(qū)動只需要在XXX_IOControl中實現(xiàn)電源的管理即可。下面是電源管理器向設(shè)備發(fā)出的電源管理命令:IOCTL_POWER_CAPABILITIES:請求設(shè)備驅(qū)動返回設(shè)備支持的電源狀態(tài)IOCTL_POWER_SET:請求驅(qū)動更新設(shè)備的電源狀態(tài)IOCTL_POWER_QUERY:詢問設(shè)備是否準備好進行狀態(tài)切換IOCTL_POWER_GET:請求驅(qū)動返回當前設(shè)備的電源狀態(tài)IOCTL_REGISTER_POWER_RELATIONSHIP:通知父設(shè)備注冊它所控制的設(shè)備

其中IOCTL_POWER_CAPABILITIES和IOCTL_POWER_SET是支持電源管理的設(shè)備驅(qū)動必須實現(xiàn)的(三)WinCE5.0的電源管理一個背光驅(qū)動電源管理的例子BOOLBAK_IOControl(

){

switch(dwCode)

{

caseIOCTL_POWE

溫馨提示

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

最新文檔

評論

0/150

提交評論