




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 ISA數(shù)據(jù)采集卡的WDM驅(qū)動(dòng)程序?qū)崿F(xiàn) 張 龍 時(shí)間:2008年11月18日 字 體: 大 中 小 關(guān)鍵詞: 摘? 要: ISA設(shè)備在WINDOWS新的驅(qū)動(dòng)程序模型WDM(WINDOWS DRIVER MODEL)中沒(méi)有獲得
2、很好的支持,使用WDM實(shí)現(xiàn)需要一些特殊處理。主要討論老式ISA設(shè)備的WDM驅(qū)動(dòng)程序的設(shè)計(jì)與實(shí)現(xiàn)。關(guān)鍵詞: Windows驅(qū)動(dòng)程序模型(WDM)? 工業(yè)標(biāo)準(zhǔn)結(jié)構(gòu)(ISA)? 數(shù)據(jù)采集?WDM作為微軟為WINDOWS 2000及以后版本準(zhǔn)備的新驅(qū)動(dòng)模型,它可以在WINDOWS 98及以后的操作系統(tǒng)上共享。這種具有跨平臺(tái)性的設(shè)備驅(qū)動(dòng)模型可以大大簡(jiǎn)化驅(qū)動(dòng)程序的開發(fā)工作。WDM支持PNP(即插即用),為用戶的PNP設(shè)備驅(qū)動(dòng)完成了大量的底層工作。這也使得WDM對(duì)各種老設(shè)備,特別是那些不具有即插即用特性硬件的支持明顯不足。在科研和工控中,最常用的數(shù)據(jù)采集卡通常都是基于PC總線的不能為PNP提供硬件支持的IS
3、A設(shè)備。為這類硬件編寫非WDM驅(qū)動(dòng)程序只能局部支持PNP特性,而且需要做大量額外的工作如:必須檢測(cè)硬件,為硬件創(chuàng)建設(shè)備對(duì)象(用于代表硬件),配置并初始化硬件使其正常工作,這些工作非常復(fù)雜。利用WDM可以避免這些麻煩。1 WDM的結(jié)構(gòu)WDM實(shí)際上是一個(gè)編寫驅(qū)動(dòng)程序的規(guī)范。其驅(qū)動(dòng)程序結(jié)構(gòu)的特點(diǎn)和WINDOWS程序設(shè)計(jì)的消息驅(qū)動(dòng)機(jī)制很相像,采用IRP驅(qū)動(dòng)機(jī)制。WINDOWS 98和WINDOWS 2000處理IRP的方式一樣,本質(zhì)卻完全不同。WDM驅(qū)動(dòng)程序面對(duì)的主要內(nèi)容是一系列內(nèi)核驅(qū)動(dòng)對(duì)象。這些對(duì)象包括驅(qū)動(dòng)對(duì)象、設(shè)備對(duì)象,還有一系列的資源抽象對(duì)象如中斷對(duì)象、適配器對(duì)象(處理DMA操作)、內(nèi)核模式派發(fā)
4、器對(duì)象、控制器對(duì)象、推遲過(guò)程對(duì)象、定時(shí)器對(duì)象、設(shè)備隊(duì)列對(duì)象、回調(diào)對(duì)象等。其中驅(qū)動(dòng)對(duì)象由I/O管理器負(fù)責(zé)創(chuàng)建和管理。設(shè)備對(duì)象代表用戶需要操作的物理或者是邏輯設(shè)備。設(shè)備對(duì)象負(fù)責(zé)管理自己設(shè)備所需要的各種資源對(duì)象。這些資源對(duì)象有的代表真正的物理設(shè)備如中斷對(duì)象、適配器對(duì)象、定時(shí)器對(duì)象;有的對(duì)象則是邏輯對(duì)象,它們是操作系統(tǒng)實(shí)現(xiàn)自己的特性所必需的,如推遲過(guò)程調(diào)用就是與操作系統(tǒng)的搶占式多任務(wù)的實(shí)現(xiàn)有關(guān)。WDM驅(qū)動(dòng)程序利用IRP和這些對(duì)象完成硬件設(shè)備的抽象化,并對(duì)應(yīng)用程序提供統(tǒng)一操作接口。這就是所謂的WDM規(guī)范。·DriverUnload 指向驅(qū)動(dòng)程序的清除例程。I/O管理器會(huì)在卸載驅(qū)動(dòng)程序前調(diào)用該例
5、程。通常WDM驅(qū)動(dòng)程序的DriverEntry例程一般不分配任何資源,所以DriverUnload例程也沒(méi)有什么清除工作要做。 ·DriverExtension->AddDevice 指向驅(qū)動(dòng)程序的AddDevice函數(shù)。AddDevice函數(shù)是WDM驅(qū)動(dòng)程序的一個(gè)特殊函數(shù),PNP管理器為每個(gè)設(shè)備實(shí)例調(diào)用該函數(shù)。它創(chuàng)建一個(gè)設(shè)備對(duì)象并把它連接到該驅(qū)動(dòng)程序的設(shè)備堆棧中。在這個(gè)函數(shù)里,設(shè)備對(duì)象被創(chuàng)建,設(shè)備需要的中斷、DMA等資源被掛接到這個(gè)設(shè)備對(duì)象上,相應(yīng)地處理函數(shù),如中斷服務(wù)例程等也被指定。·DriverStartIo,如果驅(qū)動(dòng)程序使用標(biāo)準(zhǔn)的串行IRP,則必須使用這個(gè)函數(shù)
6、,使它指向驅(qū)動(dòng)程序的StartIo例程。·MajorFunction是一個(gè)指針數(shù)組,它主要處理各種用戶的I/O請(qǐng)求IRP。默認(rèn)情況下,用戶的所有I/O請(qǐng)求都會(huì)由I/O管理器返回失敗。驅(qū)動(dòng)程序?yàn)橐幚淼腎RP指定相應(yīng)的派遣函數(shù)。此外,還有一些重要的例程如用于處理中斷操作的中斷服務(wù)例程,為了提高系統(tǒng)中斷處理效率的中斷服務(wù)推遲調(diào)用例程等。驅(qū)動(dòng)程序的其余部分就是前面所指定的那些例程的實(shí)現(xiàn)。2 為ISA設(shè)備分配資源雖然WDM驅(qū)動(dòng)程序可以簡(jiǎn)化很多工作,但是給ISA設(shè)備編寫WDM驅(qū)動(dòng)程序也有困難。這個(gè)困難是ISA設(shè)備所需資源的分配問(wèn)題。根據(jù)PNP的規(guī)范,支持PNP的設(shè)備如PCI總線設(shè)備有相應(yīng)的寄存
7、器標(biāo)識(shí)自己和自己可以接受的資源,如中斷、端口范圍、內(nèi)存范圍等,并且有相應(yīng)的邏輯支持配置資源。這使得操作系統(tǒng)啟動(dòng)過(guò)程中可以動(dòng)態(tài)地規(guī)劃和調(diào)整各個(gè)設(shè)備的資源而不需要用戶的干預(yù)。為了使ISA設(shè)備具有這種PNP的特性,可以通過(guò)PNP管理器和INF文件完成ISA設(shè)備的自動(dòng)資源分配。PNP管理器(PNP MANAGER)依賴INF文件完成PNP管理。INF文件為設(shè)備、設(shè)備驅(qū)動(dòng)程序、操作系統(tǒng)的安裝過(guò)程提供信息(包括PNP MANAGER)。為了兼容非PNP設(shè)備,INF文件支持幾個(gè)命令為設(shè)備分配資源。這些信息被提供給PNP管理器,并且被PNP管理器用來(lái)與系統(tǒng)其它部分協(xié)商以完成非PNP設(shè)備的自動(dòng)資源分配。LOGC
8、ONFIG為設(shè)備制定一個(gè)可選的資源設(shè)定。還有相關(guān)的IRQCONFIG、IOCONFIG、DMACONFIG、MEMCONFIG子命令,它們?yōu)樵O(shè)備指定具體的可選資源。語(yǔ)法如下:?ConfigPriority=DMAConfig=IOConfig=IRQConfig=MemConfig=其中CONFIGPRIOITY命令指定這個(gè)LOGCONFIG項(xiàng)的優(yōu)先級(jí)。其余子命令表示設(shè)備選用的硬件資源。下面是一個(gè)例子:?CX2590.Install;其它命令LogConfig=CX2590_DMA;指定配置項(xiàng)的名稱CX2590_DMA? ? ? ;配置項(xiàng)的名稱ConfigPriority=NORMAL ?;配
9、置的優(yōu)先級(jí)IOConfig=4300-3ff%3ff(3ff:);指定IO范圍IRQConfig=4,5,9,10,11? ;指定可選的中斷DMAConfig=0,1,2,3? ;指定可選的DMA在INF文件中加入LOGCONFIG命令可以解決ISA總線設(shè)備資源的自動(dòng)分配問(wèn)題,就可以為ISA總線設(shè)備編寫WDM驅(qū)動(dòng)程序。3 一個(gè)ISA設(shè)備WDM驅(qū)動(dòng)程序的實(shí)現(xiàn)使用Numega公司的開發(fā)工具DriverStudio 2.01可以大大地簡(jiǎn)化驅(qū)動(dòng)程序的開發(fā)過(guò)程。DriverStudio開發(fā)通用內(nèi)核模式的開發(fā)包是DriverWorks,DriverWorks是一個(gè)面向?qū)ο蟮墓ぞ甙?。它封裝了比較底層的繁復(fù)操
10、作,提供給開發(fā)者一個(gè)簡(jiǎn)潔的界面。同時(shí),DriverWorks和Visual C+有很好的接口:DriverWorks專門為Visual C+提供了一個(gè)專門開發(fā)WDM驅(qū)動(dòng)程序的WIZARD。在WIZARD指導(dǎo)下,開發(fā)者可以很容易地生成一個(gè)驅(qū)動(dòng)程序的框架。開發(fā)者要作的工作就是根據(jù)特定硬件編寫相應(yīng)的代碼。WIZARD生成的框架不僅包括設(shè)定設(shè)備的資源如中斷、IO端口范圍、內(nèi)存范圍;還包括自動(dòng)生成驅(qū)動(dòng)程序與應(yīng)用程序的接口命令及處理這些命令的處理函數(shù),生成標(biāo)準(zhǔn)驅(qū)動(dòng)程序的標(biāo)準(zhǔn)驅(qū)動(dòng)程序例程;包括DriverEntry驅(qū)動(dòng)程序入口例程、UnLoad卸載例程、Dispach標(biāo)準(zhǔn)派發(fā)器例程、StartIO標(biāo)準(zhǔn)I/O
11、傳輸例程、中斷處理例程等。對(duì)于WDM驅(qū)動(dòng)程序,包括生成驅(qū)動(dòng)程序接口(WDM專有),設(shè)備的符號(hào)連接,I/O傳輸方式以及WDM電源管理和處理PNP請(qǐng)求的IRP處理子程序。WIZARD完成后的代碼主要包括兩類,一類是驅(qū)動(dòng)對(duì)象,它構(gòu)成了一個(gè)驅(qū)動(dòng)程序的框架;另一類是驅(qū)動(dòng)程序的設(shè)備對(duì)象。驅(qū)動(dòng)程序?qū)ο筘?fù)責(zé)創(chuàng)建并管理驅(qū)動(dòng)程序設(shè)備對(duì)象。設(shè)備對(duì)象負(fù)責(zé)管理硬件的各種資源如I/O、IRQ、DMA。它還負(fù)責(zé)處理各種IRP的例程。設(shè)備對(duì)象是系統(tǒng)所有I/O操作的基石,一個(gè)驅(qū)動(dòng)程序必須有一個(gè)或一個(gè)以上的設(shè)備對(duì)象才真正有意義。驅(qū)動(dòng)對(duì)象和設(shè)備對(duì)象的關(guān)系很象WINDOWS系統(tǒng)中進(jìn)程和線程的關(guān)系:進(jìn)程是可執(zhí)行代碼(就是線程)的框架。
12、如果說(shuō)驅(qū)動(dòng)對(duì)象是WINDOWS中的進(jìn)程,那么設(shè)備對(duì)象就像進(jìn)程中的線程,它們完成實(shí)際的I/O操作。設(shè)備對(duì)象使用保護(hù)成員變量來(lái)管理設(shè)備的資源,使用成員函數(shù)來(lái)處理各種IRP請(qǐng)求,并由這些函數(shù)完成實(shí)際的I/O操作。/ 驅(qū)動(dòng)對(duì)象class AC_1810 : public KDriverSAFE_DESTRUCTORSpublic:virtual NTSTATUS DriverEntry(PUNICODE_STRINGRegistryPath);/ 驅(qū)動(dòng)程序的入口函數(shù)virtual NTSTATUS AddDevice(PDEVICE_OBJECT Pdo);/ 完成設(shè)備對(duì)象和驅(qū)動(dòng)對(duì)象的連接;/ 設(shè)備對(duì)
13、象class AC_1810Device : public KPnpDevice/ Constructorspublic:AC_1810Device(PDEVICE_OBJECT Pdo, ULONG Unit); / 構(gòu)造函數(shù)完成資源配置public:BOOLEAN Isr_Irq(void);? / IRQ中斷服務(wù)例程virtual NTSTATUS Create(KIrp I);? / 標(biāo)準(zhǔn)IRP處理函數(shù)virtual NTSTATUS Close(KIrp I);? / COMMENT_ONLYvirtual NTSTATUS Read(KIrp I);? / COMMENT_ONLY
14、virtual VOID StartIo(KIrp I);? / 開始I/O傳輸VOID CancelQueuedIrp(KIrp I);? / 判斷傳輸IRP是否被取消VOID Invalidate(void);? / 釋放資源例程virtual NTSTATUS DefaultPnp(KIrp I); ? / 處理默認(rèn)的PNP操作virtual NTSTATUS DefaultPower(KIrp I); ? / 管理電源void SerialRead(KIrp I); ? / 完成實(shí)際的I/O操作NTSTATUS IOCTL_SETUP_Handler(KIrp I); /采樣參數(shù)設(shè)定N
15、TSTATUS IOCTL_REW_Handler(KIrp I);? / 開始/停止采樣protected:KIoRange? m_IoPortRange0;? / 管理I/O資源KInterrupt? m_Irq;? / 管理中斷資源;在實(shí)際操作過(guò)程中,采用中斷讀數(shù)的方法。在驅(qū)動(dòng)程序中設(shè)置了兩個(gè)緩沖區(qū),一個(gè)前臺(tái)緩沖區(qū),一個(gè)后臺(tái)緩沖區(qū)(用作后備緩沖區(qū)),系統(tǒng)總是先使用前臺(tái)緩沖區(qū)。當(dāng)前臺(tái)緩沖區(qū)已滿而仍然未被讀出,系統(tǒng)觸發(fā)中斷時(shí),此時(shí)使用后臺(tái)緩沖區(qū)。讀數(shù)的方法很簡(jiǎn)單,系統(tǒng)先讀前臺(tái)緩沖區(qū)的數(shù)據(jù),只有當(dāng)前臺(tái)緩沖區(qū)未滿而后臺(tái)緩沖區(qū)滿的時(shí)候才讀后臺(tái)緩沖區(qū)。這樣可以保證采樣數(shù)據(jù)序列的時(shí)間順序。具體實(shí)現(xiàn)如下
16、:/ ISR例程,完成數(shù)據(jù)從FIFO中讀出BOOLEAN AC_1810Device:Isr_Irq(void)/ 是否觸發(fā)中斷?未觸發(fā)則返回,判斷兩個(gè)緩沖區(qū)情況,都滿則返回/ 前臺(tái)緩沖區(qū)未滿,使用前臺(tái)緩沖區(qū)if(m_pBuffer->numused < MAX_READ_BUF )? ? for( int i = 0;i < BLOCK_SIZE; i+)? m_pBuffer->buffm_pBuffer->numused+i? =READ_FIFO;? m_pBuffer->numused += BLOCK_SIZE;else / 完成其它情況的判斷r
17、eturn TRUE; / 中斷成功返回當(dāng)應(yīng)用程序使用標(biāo)準(zhǔn)Win32 API對(duì)設(shè)備進(jìn)行讀操作的時(shí)候,I/O管理器通知驅(qū)動(dòng)程序并觸發(fā)對(duì)Read函數(shù)的調(diào)用。對(duì)于通常的串行設(shè)備,在Read函數(shù)的最后排隊(duì)IRP請(qǐng)求,此時(shí)系統(tǒng)就可以觸發(fā)StartIO例程,并且保證這個(gè)過(guò)程是串行處理的。/ 讀例程,處理IRP_MJ_READNTSTATUS AC_1810Device:Read(KIrp I) / 檢查輸入的合法性? if ( I.ReadSize()< BLOCK_SIZE ) ? / 不合法返回錯(cuò)誤代碼? I.Information() = 0;? return I.PnpComplete(th
18、is, ? STATUS_INVALID_PARAMETER);/ 讀0字節(jié),永遠(yuǎn)成功if (I.ReadSize() = 0)? I.Information() = 0;? return ? I.PnpComplete(this, STATUS_SUCCESS);? / 排隊(duì)這個(gè)IRP觸發(fā)StartIO,完成數(shù)據(jù)傳輸return QueueIrp(I, LinkTo(CancelQueuedIrp);/ StartIo例程,完成I/O操作VOID AC_1810Device:StartIo(KIrp I)/ 檢測(cè)這個(gè)IRP是否被取消? if (!I.TestAndSetCancelRoutine(LinkTo(CancelQueuedIrp),NULL,CurrentIrp() )? ? return; / 取消則返回? ? switch (I.MajorFunction()? case IRP_MJ_READ:? /這個(gè)函數(shù)按邏輯完成讀操作? SerialRead(I); ? break;? ? / 開始處理下一個(gè)IRP? PnpNextIrp(I); ? break;ISA卡的WDM驅(qū)動(dòng)程序的主體部分就完成了。
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 精通理論的中級(jí)經(jīng)濟(jì)師試題及答案
- 水利水電工程案例解析試題及答案
- 2025年工程經(jīng)濟(jì)學(xué)習(xí)試題及答案
- 2025年項(xiàng)目管理人員年度安全培訓(xùn)考試試題含答案(輕巧奪冠)
- 2024-2025公司項(xiàng)目部安全培訓(xùn)考試試題答案原創(chuàng)題
- 2024-2025項(xiàng)目安全培訓(xùn)考試試題及參考答案(典型題)
- 2025年市政工程前沿技術(shù)試題及答案
- 2025年經(jīng)濟(jì)決策分析框架試題及答案
- 2025-2030年藝術(shù)攝影服務(wù)行業(yè)市場(chǎng)發(fā)展分析及政策建議與策略研究報(bào)告
- 2025-2030年航空服務(wù)產(chǎn)業(yè)行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 北京故宮的詳細(xì)資料資料講解
- GB/T 38472-2023再生鑄造鋁合金原料
- 莫高窟經(jīng)典簡(jiǎn)介
- 2023年貴州黔南州人民檢察院招考聘用派遣制檢察輔助人員筆試題庫(kù)含答案解析
- CMOS反相器的與設(shè)計(jì)
- 大概念教學(xué):素養(yǎng)導(dǎo)向的單元整體設(shè)計(jì)
- 核醫(yī)學(xué)科儀器管理操作保養(yǎng)維修制度
- 《祝?!放涮讋”?課件
- 工余安健環(huán)培訓(xùn)
- 衛(wèi)生部手術(shù)分級(jí)目錄2011年版四級(jí)手術(shù)部分
- 美國(guó)大選-特朗普介紹(個(gè)人演講PPT)
評(píng)論
0/150
提交評(píng)論