<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è) > 嵌入式系統 > 設計應用 > 根據PCI總線(xiàn)的實(shí)時(shí)測頻卡WDM驅動(dòng)程序設計策略

根據PCI總線(xiàn)的實(shí)時(shí)測頻卡WDM驅動(dòng)程序設計策略

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


4測頻卡程序實(shí)現

在微軟公司DDK工具的支持下,Compuware Nu-Mega公司提供Driver Studio工具包中的DriverWorks將程序編寫(xiě)所需的對內核及對硬件的訪(fǎng)問(wèn)封裝成類(lèi)庫,加上程序代碼生成向導DriverlWizard,極大地簡(jiǎn)化了驅動(dòng)程序的開(kāi)發(fā)難度。本文選擇DriverWorks作為驅動(dòng)程序的開(kāi)發(fā)工具。

測頻卡驅動(dòng)程序的主要功能是為用戶(hù)讀取所測信號的頻率參數,包括載頻、調制方式、碼元速率等。同時(shí)用戶(hù)還能通過(guò)驅動(dòng)程序發(fā)送命令對測頻卡的工作方式進(jìn)行控制。由此可知,驅動(dòng)程序要重點(diǎn)處理好硬件訪(fǎng)問(wèn)和中斷處理工作。

4.1I/O訪(fǎng)問(wèn)

類(lèi)KIoRange封裝了對I/O端口的操作。本卡中配置寄存器中的Base 2基地址寄存器定義了I/O空間。在OnstartDevice例程中取得I/O資源,并初始化,其函數實(shí)現如下:



完成初始化后,可以用成員函數inb,inw,ind從I/O端口讀一個(gè)(多個(gè))字節、字、雙字的數據;outb,outw,outd向I/O端口寫(xiě)一個(gè)(多個(gè))字節、字、雙字的數據。

4.2內存訪(fǎng)問(wèn)

在Windows系統中,內存分為分頁(yè)內存和非分頁(yè)內存。在WDM驅動(dòng)程序中,對于硬件的內存映射一般需要用非分頁(yè)內存。因為在一些較高級別的例程中,使用分頁(yè)內存會(huì )造成系統產(chǎn)生缺頁(yè)中斷,從而引起死鎖。使用非分頁(yè)內存無(wú)需太多的轉換,非常安全,效率也高。類(lèi)KMemoryRange封裝了對設備映射內存的操作。類(lèi)KMemoryRange成員函數的讀/寫(xiě)操作同類(lèi)KIoRange。由配置寄存器中的Base 0和Base 1基地址寄存器分別定義了兩個(gè)內存空間。在OnstartDevice例程中取得內存資源并初始化,其函數實(shí)現如下:

Status=m_MemoryRange0.Initialize(pResListTranslated,pResListRaw,PciConfig.BaseAddresslndexToOrdinal(0));
Status=m_MemoryRangel.Initialize(pResListTranslated,pResListRaw,PeiConfig.BaseAddresslndexToOrdinal(1));

4.3中斷處理

中斷處理一般需要聲明兩種類(lèi)實(shí)例:Klnterrupt和KDeferredCall。Kinterrupt類(lèi)用于實(shí)現硬件中斷處理;KDeferredCall類(lèi)用于實(shí)現延時(shí)過(guò)程調用。首先創(chuàng )建一個(gè)Klnterrupt類(lèi)實(shí)例m_Irq,將此實(shí)例作為設備類(lèi)的成員變量,然后創(chuàng )建一個(gè)KDeferredCall類(lèi)實(shí)例m_DpcFor_Irq。m_Irq對應的中斷服務(wù)例程和m_DpcFor_Irq對應的延時(shí)過(guò)程調用例程也需要在實(shí)例中聲明。這兩個(gè)實(shí)例m_Irq和m_DpcFor_Irq都是在OnstartDevice例程中初始化的,代碼如下:

status=m_Irq.InifializeAndConnect(pResListTranslated,LinkTo(Isr_Irq),This);
m_DpcFor_Irq.Setup(LinkTo(DpeFor_Irq),this);

中斷服務(wù)例程的處理時(shí)間應盡量短,對于一些耗時(shí),但不需要立即處理的任務(wù),中斷服務(wù)程序會(huì )調用一個(gè)低于中斷服務(wù)程序DIRQL級別的延遲過(guò)程調用程序DPC,在DISPATCH_LEVEL上完成處理,這個(gè)級別上的限制較少,函數調用也相對比較方便。在中斷服務(wù)例程中,首先判斷中斷是否是自己設備產(chǎn)生的,若不是,返回FALSE;若是,進(jìn)行必要的處理,請求一個(gè)DPC(延時(shí)過(guò)程調用),然后返回TRUE。關(guān)鍵代碼如下:



在延時(shí)過(guò)程調用例程DpcFor_Irq中,讀取所測信號的頻率參數:



5驅動(dòng)程序與應用程序之間的通信

雖然驅動(dòng)程序是為設備的硬件層編程服務(wù)的,但同樣需要提供和應用程序進(jìn)行通信的能力,從而最終達到應用程序控制設備的目的。應用程序與驅動(dòng)程序之間的通信通過(guò)調用Win32 API來(lái)實(shí)現,應用程序用Creatfile函數通過(guò)已經(jīng)定義的設備接口來(lái)獲取驅動(dòng)程序文件句柄,然后將文件句柄作為其他Win32 API函數的一個(gè)參數,對驅動(dòng)程序的進(jìn)行數據操作。調用DeviceloControl進(jìn)行數據量較小的,如控制指令傳輸或端口、寄存器訪(fǎng)問(wèn);調用ReadFile,WriteFile等函數進(jìn)行數據量較大的傳輸,如內存讀/寫(xiě)等。驅動(dòng)程序與應用程序的通信有DeviceControl異步完成、共享Win32事件通知兩種方式。Win32事件通知是由應用程序創(chuàng )建了一個(gè)事件后,設置事件的狀態(tài)為Unsignal,然后直接將該事件句柄傳遞給驅動(dòng)程序,等待驅動(dòng)程序發(fā)送事件通知。驅動(dòng)程序通過(guò)類(lèi)Kevent獲取這個(gè)事件的一個(gè)對象指針后,在IRQL≤DISPATCH_LEVEL級別的例程中設置事件信號狀態(tài)為Signal來(lái)通知應用程序進(jìn)行后續處理。

6結語(yǔ)

基于上述的硬件結構和驅動(dòng)方法,成功開(kāi)發(fā)了一款測頻卡,在實(shí)際中得到了很好的應用,板卡工作正常,達到了預期效果。實(shí)踐證明,DriverWorks是一款功能強大,使用方便的驅動(dòng)程序開(kāi)發(fā)工具,利用它可以方便快捷地構造PCI設備的驅動(dòng)程序框架,大大加快了開(kāi)發(fā)周期,提高了開(kāi)發(fā)效率。

本文引用地址:http://dyxdggzs.com/article/151875.htm

上一頁(yè) 1 2 下一頁(yè)

評論


相關(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>