日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式教程
[導(dǎo)讀]模塊化的設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)方法

摘要:介紹了WindowsNT下設(shè)備驅(qū)動(dòng)程序的開(kāi)發(fā)環(huán)境,一種模塊化的設(shè)計(jì)方法,應(yīng)用程序與驅(qū)動(dòng)程序之間的同步以及驅(qū)動(dòng)程序的安裝。

關(guān)鍵詞:WindowsNT;設(shè)備驅(qū)動(dòng)程序;Event對(duì)象?

1引言

WindowsNT/2K以其形象直觀的界面、簡(jiǎn)單方便的操作,基本上已經(jīng)取代DOS成為測(cè)控軟件的操作平臺(tái)。又因?yàn)閃indowsNT/2K出于安全性、穩(wěn)定性的考慮,為了防止用戶(hù)應(yīng)用程序訪(fǎng)問(wèn)和更改重要的操作系統(tǒng)數(shù)據(jù),WindowsNT/2K使用兩種“處理器訪(fǎng)問(wèn)模式”:用戶(hù)態(tài)和核心態(tài)。在用戶(hù)態(tài),應(yīng)用程序不能直接對(duì)硬件進(jìn)行訪(fǎng)問(wèn)和操作;而在核心態(tài)中,程序?qū)θ魏蜪/O設(shè)備有全部的訪(fǎng)問(wèn)權(quán),還能訪(fǎng)問(wèn)任何虛地址和控制虛擬內(nèi)存硬件。為了使用戶(hù)態(tài)的程序訪(fǎng)問(wèn)和操作硬件,必須通過(guò)某種機(jī)制,也就是使用設(shè)備驅(qū)動(dòng)程序跨越操作系統(tǒng)的邊界對(duì)物理硬件進(jìn)行訪(fǎng)問(wèn)操作。同時(shí)提供一些控制接口,進(jìn)而用戶(hù)態(tài)的應(yīng)用程序利用設(shè)備驅(qū)動(dòng)程序提供的接口間接地對(duì)物理硬件進(jìn)行訪(fǎng)問(wèn)操作。

2設(shè)備驅(qū)動(dòng)程序的開(kāi)發(fā)環(huán)境

安裝4種軟件:MicrosoftVisualC++6.0、PlatformSDK(SoftwareDevelopKit)forWindowsNT、DDK(DeviceDevelopKit)forWindowsNT、DriverStudio2.0。然后進(jìn)行一些系統(tǒng)環(huán)境變量的設(shè)置:

(1)變量名:MSTOOLS,值:SDK在操作系統(tǒng)中的安裝路徑(如:C:mstools);

(2)變量名:CPU,值:i386;

(3)變量名:BASEDIR,值:DDK在操作系統(tǒng)中的安裝路徑(如:C:NTDDK)。

在開(kāi)發(fā)驅(qū)動(dòng)程序時(shí),首先要生成DriverStudio需要的庫(kù)文件vdw.lib(通過(guò)編譯DriverStudio安裝目錄下\DriverWorks\Source\vdw.dsw)。然后運(yùn)用DriverStudio2.0生成一個(gè)編程框架,并刪除DriverStudio所生成的編程框架中的所有文件,就可以在這個(gè)框架中編寫(xiě)自己的設(shè)備驅(qū)動(dòng)程序;編寫(xiě)完以后可以直接在VisualC++6.0下Build生成設(shè)備驅(qū)動(dòng)程序*.sys。

3模塊化驅(qū)動(dòng)程序的編寫(xiě)

3.1設(shè)備驅(qū)動(dòng)程序包括的幾大模塊

設(shè)備驅(qū)動(dòng)程序管理實(shí)際數(shù)據(jù)傳輸和控制物理設(shè)備的操作,包括開(kāi)始和完成I/O操作、處理中斷和執(zhí)行設(shè)備要求的任何操作。

一般通用的設(shè)備驅(qū)動(dòng)程序可以分為主要4個(gè)模塊:初始化例程、卸載例程、驅(qū)動(dòng)程序和應(yīng)用程序之間的數(shù)據(jù)交換例程、中斷服務(wù)例程。

3.1.1初始化例程(DrvierEntry)?

是驅(qū)動(dòng)程序的入口。在這個(gè)例程中主要包括以下步驟:?

(1)初始化Driver對(duì)象;?

(2)調(diào)用IoCreateDevice創(chuàng)建一個(gè)Device對(duì)象,并通過(guò)調(diào)用IoCreateSymbolicLinks使設(shè)備對(duì)Win32子系統(tǒng)可見(jiàn);

(3)初始化Device對(duì)象的DeviceExtension;?

(4)查找和分配驅(qū)動(dòng)程序要管理的任何硬件;?

(5)把一個(gè)設(shè)備連接到一個(gè)Interrupt對(duì)象,如果需要并初始化驅(qū)動(dòng)程序的DPC對(duì)象。?

3.1.2卸載例程(DriverUnload)

它與驅(qū)動(dòng)程序的初始化例程剛好相反。

(1)把與設(shè)備連接的Interrupt對(duì)象斷開(kāi)。一旦Interrupt對(duì)象消失,設(shè)備不產(chǎn)生任何中斷請(qǐng)求,這是最重要的;

(2)釋放驅(qū)動(dòng)程序所占用的任何系統(tǒng)資源;

(3)使用IoDeleteSymbolicLink從Win32名字空間刪除設(shè)備,并用IoDeleteDevice刪除Device對(duì)象自身。

3.1.3驅(qū)動(dòng)程序與應(yīng)用程序之間的數(shù)據(jù)交換例程

首先簡(jiǎn)單介紹一下I/0請(qǐng)求包(IRP):IRP是I/O系統(tǒng)用來(lái)存儲(chǔ)I/O請(qǐng)求信息的地方。IRP由兩部分組成:固定部分(稱(chēng)作標(biāo)題)和一個(gè)或多個(gè)堆棧單元。固定部分信息包括:請(qǐng)求的類(lèi)型和大小、同步請(qǐng)求還是異步請(qǐng)求,用于緩沖I/O的指向緩沖區(qū)的指針和由于請(qǐng)求的進(jìn)展而變化的狀態(tài)信息;IRP的堆棧單元包括一個(gè)功能碼、功能特定參數(shù)和一個(gè)指向調(diào)用者文件對(duì)象的指針。

應(yīng)用程序與驅(qū)動(dòng)程序交換數(shù)據(jù)主要是由Win32CreateFile、CloseHandle、ReadFile、WriteFile和DeviceIoControl函數(shù)發(fā)出請(qǐng)求,接著I/O管理器把這些請(qǐng)求轉(zhuǎn)化為叫做I/O請(qǐng)求包(IRP)的數(shù)據(jù)結(jié)構(gòu)形式,再由I/O管理器把這些I/O請(qǐng)求包發(fā)送到驅(qū)動(dòng)程序。數(shù)據(jù)交換例程的主要作用是接收I/O管理器所發(fā)出的IRP,然后解析這些IRP,從而得知IRP從應(yīng)用程序傳遞過(guò)來(lái)的數(shù)據(jù)。解析IRP主要是運(yùn)用C語(yǔ)言的switch語(yǔ)句,根據(jù)IRP的堆棧單元中的參數(shù)(如IRP_MJ_CREATE、IRP_MJ_READ、IRP_MJ_DEVICE_CONTROL等)進(jìn)行不同的處理。最后IRP的完成處理也非常重要,它要做的是返回系統(tǒng),完成一個(gè)I/O請(qǐng)求的信息,系統(tǒng)根據(jù)返回的信息釋放IRP,以便使系統(tǒng)順利進(jìn)行下一個(gè)IRP的處理。這里需要說(shuō)明的是這個(gè)例程只是完成了數(shù)據(jù)從應(yīng)用程序到驅(qū)動(dòng)程序的傳遞,而沒(méi)有進(jìn)行任何實(shí)際的設(shè)備操作。

3.1.4中斷服務(wù)例程

中斷服務(wù)例程主要是進(jìn)行直接的任何設(shè)備的操作。驅(qū)動(dòng)程序與應(yīng)用程序之間的數(shù)據(jù)交換例程只完成了數(shù)據(jù)從用戶(hù)空間到核心空間的傳遞,而中斷服務(wù)例程根據(jù)傳遞過(guò)來(lái)的數(shù)據(jù),直接對(duì)I/O端口進(jìn)行訪(fǎng)問(wèn)操作。

3.2設(shè)備驅(qū)動(dòng)程序的模塊化實(shí)現(xiàn)

每個(gè)NT內(nèi)核模式驅(qū)動(dòng)程序,不管它的用途是什么,都必須顯露一個(gè)叫做DriverEntry的例程,也就是設(shè)備驅(qū)動(dòng)程序的初始化例程。它是驅(qū)動(dòng)程序的入口點(diǎn),DriverEntry是一個(gè)公認(rèn)的名字(任何內(nèi)核驅(qū)動(dòng)程序的入口點(diǎn)必須用這個(gè)名字,不能改變),有了這個(gè)公認(rèn)的名字,I/O管理器就能順利地為每個(gè)驅(qū)動(dòng)程序找到入口點(diǎn)并對(duì)其進(jìn)行初始化。

一些函數(shù)聲明:

∥初始化Driver對(duì)象?

VOIDInitializeDriverObject(INPDRIVER_OBJECTDriverObject);?

∥創(chuàng)建一個(gè)Device對(duì)象和使設(shè)備對(duì)Win32子系統(tǒng)可見(jiàn)?

NTSTATUSCreateDevice(INPWSTRDriverName,?

INDRIVER_TYPEDriverType,?

INPDRIVER_OBJECTDriverObject,?

OUTPDEVICE_OBJECT*DeviceObject);?

∥初始化DeviceExtension?

VOIDInitializeDeviceExtension(INPDEVICE_OBJECTDeviceObject,?

INPDEVICE_EXTENSIONDeviceExtension);?

∥查找并給設(shè)備分配資源?

NTSTATUSQueryAndAllocateHardware(INPUNICODE--STRINGpath,?

INPDEVICE_OBJECTDeviceObject);?

∥連接一個(gè)中斷?

NTSTATUSDriverConnectInterrupt(?

INPDEVICE_EXTENSIONDeviceExtension);?

如果以上幾個(gè)函數(shù)中,有函數(shù)返回不成功的狀態(tài)值時(shí),一定要?jiǎng)h除在調(diào)用這個(gè)函數(shù)之前創(chuàng)建成功的,可能是以下3個(gè)中的1個(gè)和多個(gè):創(chuàng)建的Device對(duì)象、Win32名字空間的設(shè)備和給設(shè)備分配的系統(tǒng)資源。[!--empirenews.page--]

NTSTATUSDriverEntry(INPDRIVER_OBJECT

}

4應(yīng)用程序與驅(qū)動(dòng)程序之間的同步

一般在設(shè)備驅(qū)動(dòng)程序中用中斷服務(wù)例程來(lái)訪(fǎng)問(wèn)和操作硬件設(shè)備,它利用應(yīng)用程序傳遞過(guò)來(lái)的數(shù)據(jù)進(jìn)行中斷操作。為了保證外界設(shè)備正常工作,在驅(qū)動(dòng)程序中一定要有一個(gè)緩沖區(qū)來(lái)存儲(chǔ)一定數(shù)量的數(shù)據(jù)。例如在數(shù)控加工中,讓機(jī)床切一個(gè)圓,必須保證機(jī)床在切這個(gè)圓時(shí)的動(dòng)作連續(xù),如果沒(méi)有一個(gè)緩沖區(qū)存儲(chǔ)一定數(shù)量的數(shù)據(jù),就有可能出現(xiàn)驅(qū)動(dòng)程序等待應(yīng)用程序傳遞數(shù)據(jù),從而造成機(jī)床的暫時(shí)停頓。然而如果在驅(qū)動(dòng)程序中開(kāi)一個(gè)緩沖區(qū)來(lái)存儲(chǔ)數(shù)據(jù),也會(huì)產(chǎn)生一個(gè)問(wèn)題:應(yīng)用程序傳遞的數(shù)據(jù)與這些數(shù)據(jù)的執(zhí)行之間有一定的時(shí)間差,導(dǎo)致應(yīng)用程序不知道設(shè)備正在進(jìn)行什么操作。為了解決這個(gè)問(wèn)題,也就是要保證應(yīng)用程序與驅(qū)動(dòng)程序之間的同步。有了這個(gè)同步信號(hào),可以讓?xiě)?yīng)用程序了解設(shè)備正在進(jìn)行何種操作。解決同步問(wèn)題可以用Event對(duì)象。

具體方法:在驅(qū)動(dòng)程序中創(chuàng)建內(nèi)核的Event對(duì)象,但是又因?yàn)轵?qū)動(dòng)程序和應(yīng)用程序分別運(yùn)行于核心層和用戶(hù)層,因此他們之間要看到對(duì)方定義的事件相對(duì)比較困難,必須要有一個(gè)專(zhuān)門(mén)的事件名存放空間。這里有一個(gè)命名方法可以使用戶(hù)層和核心層都可看到Event對(duì)象,事件命名應(yīng)為L(zhǎng)\BaseNamedObjects\xxx形式。

在核心層用IoCreateNotificationEvent創(chuàng)建一個(gè)Event對(duì)象,用KeSetEvent把Event對(duì)象設(shè)置為Signal。用戶(hù)層用OpenEvent創(chuàng)建Event對(duì)象,這個(gè)Event對(duì)象名一定要與在核心層創(chuàng)建的Event對(duì)象名一樣,然后用戶(hù)層用WaitForSingleObject等待Event對(duì)象的狀態(tài)為Signal,一旦Event對(duì)象的狀態(tài)為Signal,讓?xiě)?yīng)用程序訪(fǎng)問(wèn)一次驅(qū)動(dòng)程序,從而可以讓?xiě)?yīng)用程序知道設(shè)備正在進(jìn)行的操作,保證應(yīng)用程序與驅(qū)動(dòng)程序之間的同步。

5設(shè)備驅(qū)動(dòng)程序的安裝

設(shè)備驅(qū)動(dòng)程序的安裝可以分為:手動(dòng)安裝、非標(biāo)準(zhǔn)驅(qū)動(dòng)程序的最終用戶(hù)安裝和標(biāo)準(zhǔn)驅(qū)動(dòng)程序的最終用戶(hù)安裝。這里主要介紹前兩種方法。

5.1手動(dòng)安裝

主要用于驅(qū)動(dòng)程序的開(kāi)發(fā)過(guò)程中,主要執(zhí)行以下的基本步驟:

(1)把編譯好的*.sys文件拷貝到系統(tǒng)的%SystemRoot%\system32\drivers目錄下。?

(2)在注冊(cè)表中加入合適的項(xiàng):

(3)使用控制面板中的Device應(yīng)用小程序啟動(dòng)驅(qū)動(dòng)程序。?

5.2非標(biāo)準(zhǔn)驅(qū)動(dòng)程序的最終用戶(hù)安裝?

主要是使用下面一些Win32API調(diào)用建立自己的安裝程序:?

(1)CopyFile把驅(qū)動(dòng)程序文件(包括一些自己定義的參數(shù)文件)拷貝到指定的目錄。

(2)RegCreateKeyEx和RegSetValueEx在Registry中建立驅(qū)動(dòng)程序需要的鍵和值。?

(3)CreateService和StartService創(chuàng)建和啟動(dòng)驅(qū)動(dòng)程序。?

(4)OpenService和DeleteService來(lái)卸載驅(qū)動(dòng)程序。?

6結(jié)論

通過(guò)模塊化的方法介紹了驅(qū)動(dòng)程序的寫(xiě)法、驅(qū)動(dòng)程序的開(kāi)發(fā)環(huán)境和安裝,給讀者一個(gè)清晰的驅(qū)動(dòng)程序的開(kāi)發(fā)過(guò)程,有助于初學(xué)者快速抓住驅(qū)動(dòng)程序開(kāi)發(fā)的框架。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶(hù)體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉