• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      超聲相控陣系統(tǒng)中PCI驅(qū)動開發(fā)研究

      2015-09-08 10:13:47施成龍師芳芳孔超張碧星
      聲學(xué)技術(shù) 2015年3期
      關(guān)鍵詞:驅(qū)動程序相控陣中斷

      施成龍,師芳芳,孔超,張碧星

      ?

      超聲相控陣系統(tǒng)中PCI驅(qū)動開發(fā)研究

      施成龍,師芳芳,孔超,張碧星

      (中國科學(xué)院聲學(xué)研究所聲場聲信息國家重點實驗室,北京100190)

      超聲相控陣系統(tǒng)的數(shù)據(jù)傳輸速率很大程度上決定著其檢測速度,因而在PCI總線的超聲相控陣系統(tǒng)中,PCI驅(qū)動執(zhí)行效率至關(guān)重要。詳細闡述了利用WinDriver、DriverStudio和WDK(Windows Driver Kit)三種工具開發(fā)PCI驅(qū)動程序的方法及實現(xiàn)。在驅(qū)動效率和兼容性等方面上比較這三種不同的驅(qū)動開發(fā)方案。分析及測試結(jié)果表明,使用DriverStudio開發(fā)的驅(qū)動能夠高速穩(wěn)定地工作,滿足超聲相控陣系統(tǒng)對于數(shù)據(jù)傳輸速率和穩(wěn)定性的要求。由于不同的應(yīng)用有著不同的開發(fā)需求,提出根據(jù)特定的開發(fā)需求選擇不同的開發(fā)方案,從而得到需要的驅(qū)動及其應(yīng)用程序。

      相控陣;PCI總線;驅(qū)動程序

      0 引言

      超聲相控陣檢測技術(shù)是近年發(fā)展起來的一種超聲無損檢測技術(shù),這種技術(shù)能方便控制聲束焦點和方向,提高檢測信號的信噪比,具有靈活、快速、可靠、準確等特點。超聲相控陣技術(shù)最主要的特點是采用超聲陣列發(fā)射和陣列接收的方式,通過控制陣列上各個陣元激勵信號的延時和幅度,實現(xiàn)動態(tài)聚焦和偏轉(zhuǎn)。超聲相控陣技術(shù)的出現(xiàn)在提高了在線檢測精度的同時大大提高了檢測速度[1]。

      由于超聲探傷要求的不斷提高,超聲相控陣檢測系統(tǒng)的獨立通道數(shù)隨之增加,國外的超聲相控陣檢測系統(tǒng)Dynary獨立通道數(shù)達到了256個,TOPAZ的獨立通道數(shù)也達到了256個。獨立通道數(shù)的增加導(dǎo)致數(shù)據(jù)量的激增,由此產(chǎn)生了高速實時數(shù)據(jù)傳輸?shù)男枨蟆T诒姸嗟母咚賹崟r數(shù)據(jù)傳輸解決方案中, USB2.0傳輸速率可達60 MB/s,PCI總線數(shù)據(jù)傳輸速率達133MB/s[2],PCI-Express總線數(shù)據(jù)傳輸速率達16GB/s。USB2.0的CPU占用率較高,不適用于超聲相控陣系統(tǒng),PCI及PCI-Express均滿足超聲相控陣系統(tǒng)數(shù)據(jù)傳輸速率的要求,但PCI-Express的通用性沒有PCI好,而PCI總線接口則是目前計算機中使用最為廣泛的接口[3-5],因此本文選擇PCI總線作為開發(fā)超聲相控陣系統(tǒng)的數(shù)據(jù)總線。

      為了能夠正常使用PCI總線進行高速數(shù)據(jù)傳輸,必須開發(fā)相應(yīng)平臺下的設(shè)備驅(qū)動程序。在Windows平臺下,存在著WDM(Windows Driver Model)和WDF(Windows Driver Foundation)這兩種模型的驅(qū)動程序,后者以前者為基礎(chǔ)進行了建模和封裝,降低了開發(fā)難度。

      本文根據(jù)筆者編寫PCI9656驅(qū)動的實際經(jīng)驗,闡述了開發(fā)PCI設(shè)備WDM和WDF驅(qū)動程序的方法流程和實現(xiàn),并通過對于不同驅(qū)動的性能進行比較,得到在不同開發(fā)條件下的最優(yōu)方案。

      1 超聲相控陣系統(tǒng)

      本文所涉及開發(fā)的超聲相控陣系統(tǒng)結(jié)構(gòu)如圖1所示:

      主機板通過PCI總線從多個數(shù)據(jù)采集板獲得超聲回波數(shù)據(jù),對得到的數(shù)據(jù)進行處理并進行成像顯示和分析,如圖2所示。

      在這樣的結(jié)構(gòu)中,若主機板沒有及時通過PCI接口芯片將數(shù)據(jù)采集板中的回波數(shù)據(jù)取出,那么數(shù)據(jù)會由于不斷堆疊而造成溢出,從而導(dǎo)致主機板得到的傳輸數(shù)據(jù)錯位、解析錯誤等一系列問題,因此系統(tǒng)中設(shè)備PCI驅(qū)動的執(zhí)行效率至關(guān)重要。

      2 WDM驅(qū)動開發(fā)

      2.1 WDM驅(qū)動模型介紹

      WDM(Windows Driver Model)是微軟公司開發(fā)出的一種驅(qū)動程序開發(fā)模型,屬于操作系統(tǒng)的內(nèi)核模式。WDM驅(qū)動基于分層的模式實現(xiàn),不同層上的驅(qū)動程序有著不同的優(yōu)先級[6]。其中與系統(tǒng)連接最緊密的是底層總線,總線驅(qū)動也是最為復(fù)雜的部分。目前總線驅(qū)動通常由操作系統(tǒng)提供,驅(qū)動開發(fā)者只需開發(fā)設(shè)備驅(qū)動以及可能需要的過濾驅(qū)動[7]。圖3所示為WDM驅(qū)動模型層次結(jié)構(gòu)圖。

      WDM驅(qū)動程序開發(fā)工具主要有三種[8]:DDK(Device Development Kit)、WinDriver與DriverStudio。DDK是微軟提供的一套用于開發(fā)Windows下設(shè)備驅(qū)動程序的工具包,雖然用其開發(fā)的程序執(zhí)行效率高,但由于采用DDK開發(fā)驅(qū)動程序需要閱讀大量的DDK文檔,深入了解操作系統(tǒng)的內(nèi)核工作方式和驅(qū)動程序的工作細節(jié),開發(fā)難度大,開發(fā)周期長;WinDriver是Jungo公司出版的驅(qū)動程序開發(fā)組件,采用其開發(fā)驅(qū)動難度較低,花費的時間很少,它不需要開發(fā)者了解操作系統(tǒng)的內(nèi)核和驅(qū)動程序的內(nèi)部機制,事實上開發(fā)者只需定制和調(diào)用它提供的通用驅(qū)動而已,因此程序的執(zhí)行效率不高;DriverStudio是一套NuMega公司為簡化Windows設(shè)備驅(qū)動程序和應(yīng)用程序的開發(fā)而提供的集編寫、編譯和調(diào)試為一體的軟件工具包,它的函數(shù)庫封裝了針對驅(qū)動程序的各種通用操作,大大減少了驅(qū)動程序的代碼長度,而由于它開發(fā)的驅(qū)動程序本質(zhì)上是在調(diào)用DDK庫函數(shù),所以執(zhí)行效率與DDK相當。

      綜上所述,由于DDK開發(fā)WDM驅(qū)動無論在開發(fā)時間和代碼效率上都沒有明顯優(yōu)勢,因此通常采用其他兩種開發(fā)工具來開發(fā)WDM驅(qū)動。

      2.2 WinDriver開發(fā)工具

      WinDriver可以方便Windows程序員快速開發(fā)出PCI/ISA設(shè)備的Windows驅(qū)動程序。它的體系架構(gòu)分為兩種模式:用戶模式和核心模式。對硬件進行操作時,開發(fā)者調(diào)用用戶模式的庫函數(shù),用戶模式的庫函數(shù)再調(diào)用核心模式完成對硬件的最終訪問[9]。其與硬件設(shè)備、用戶驅(qū)動程序、用戶應(yīng)用程序之間的關(guān)系即體系結(jié)構(gòu)如圖4所示。

      使用WinDriver開發(fā)驅(qū)動大致為三個步驟:

      (1) 選擇硬件

      從開始菜單里,選擇WinDriver|DriverWizard,運行DriverWizard程序。DriverWizard將會顯示機器上的所有即插即用設(shè)備,在列表中選擇需要開發(fā)驅(qū)動的硬件設(shè)備。

      (2) 產(chǎn)生驅(qū)動程序代碼

      使用DriverWizard產(chǎn)生驅(qū)動程序代碼,程序操作硬件的內(nèi)核級API函數(shù),對設(shè)備進行讀寫操作。

      (3) 根據(jù)實際需求修改驅(qū)動程序代碼

      本文需要對多塊超聲回波信號數(shù)據(jù)采集板進行寄存器讀寫和DMA讀寫,因此需要開發(fā)的應(yīng)用程序框架如圖5所示。

      其中各個步驟所涉及到的WinDriver API函數(shù)為:

      (a) 初始化設(shè)備

      首先使用PLX_LibInit函數(shù)初始化WinDriver的庫,然后使用WDC_PciScanDevices函數(shù)掃描硬件并獲取驅(qū)動句柄。

      (b) 打開設(shè)備

      使用PLX_DeviceOpenBySlot函數(shù)根據(jù)設(shè)備的ID號尋找并打開設(shè)備。

      (c) 訪問設(shè)備資源

      使用WDC_WriteAddr32函數(shù)寫寄存器,使用WDC_ReadAddr32讀寄存器。

      通過PLX_DMAOpen、PLX_DMAStart、PLX_DMAPollCompletion和PLX_DMAClose這四個函數(shù)來進行DMA讀寫。

      (d) 關(guān)閉設(shè)備

      使用PLX_DeviceClose函數(shù)關(guān)閉打開的設(shè)備。

      (e) 關(guān)閉WinDriver處理接口

      使用PLX_LibUninit函數(shù)卸載庫并關(guān)閉WinDriver處理接口。

      2.3 DriverStudio開發(fā)工具

      DriverStudio以面向?qū)ο蟮姆绞剑瑢Ⅱ?qū)動程序編寫所需的與內(nèi)核訪問及對硬件的訪問封裝成類,加上設(shè)計的驅(qū)動程序代碼生成向?qū)?,大大簡化了?qū)動程序開發(fā)的難度,減少了工作量。同時,DriverStudio被嵌入到VC中,方便了開發(fā)[10]。

      使用DriverStudio開發(fā)PCI驅(qū)動主要有三個步驟:

      (1) 利用DriverWizard生成PCI設(shè)備驅(qū)動程序框架

      DriverWizard是DriverStudio創(chuàng)建框架程序的工具,它能夠生成驅(qū)動程序的基本框架和用戶自定義信息,雖然沒有實現(xiàn)設(shè)備的具體功能,但對于功能的實現(xiàn)設(shè)置了框架,方便用戶添加功能代碼。創(chuàng)建程序框架共有11個步驟,一般采用默認設(shè)置,關(guān)鍵步驟如下:

      (a) 第4步,選擇設(shè)備的總線類型并填寫硬件類型。

      本文開發(fā)的是PCI9656的驅(qū)動,因此這里選擇PCI總線。PCI Vendor ID是廠商標識符,為10B5;PCI Device ID是設(shè)備標識符,為9656;PCI Subsystem ID為子系統(tǒng)ID號,為965610B5;PCI Revision ID是修訂號,為BA。

      (b) 第7步,選擇IRP串行處理類型。

      當多個應(yīng)用程序同時對PCI設(shè)備進行I/O操作時,需要對這些請求進行串行化處理,通常選擇系統(tǒng)處理。

      (c) 第9步,選擇設(shè)備文件類名和接口。

      在Resources項中,選擇需要被使用的硬件資源如:存儲空間,I/O空間,中斷和DMA等。在本例中需要用到的資源有:基地址為0的存儲空間、基地址為2的存儲空間、中斷和DMA。

      在Interface中,可以選擇應(yīng)用程序打開設(shè)備的方式:用GUID接口或符號鏈接名。GUID是一種說明軟件訪問硬件過程的命名方案,一個128位GUID唯一標識一個設(shè)備接口。若使用GUID接口方式的話必須每一個數(shù)字板都對應(yīng)一個唯一GUID標識的驅(qū)動,這代表了驅(qū)動無法復(fù)用。而符號鏈接名(symbolic link name)的主要用途是把DOS的名稱連接到設(shè)備上。當多塊相同配置的PCI板卡插入PCI插槽時,可以使用同一個PCI驅(qū)動,因此選擇符號鏈接名的方式。Interface配置如圖6所示。

      (d) 第10步,定義驅(qū)動與應(yīng)用程序之間通信的DeviceIoControl控制代碼。

      需要使用驅(qū)動來完成對于硬件設(shè)備寄存器與DMA讀寫的操作,而DMA讀寫只需調(diào)用Windows API函數(shù)Readfile和Writefile即可,因此定義的功能為:讀寫寄存器、讀寫DMA地址。配置如圖7所示。

      最后一步選擇生成與驅(qū)動通信的應(yīng)用程序,單擊Finish完成驅(qū)動程序框架。

      (2) 在已完成的驅(qū)動框架中添加功能代碼

      (a) 內(nèi)存的訪問

      KMemoryRange類封裝了對于內(nèi)存的操作,實現(xiàn)對內(nèi)存映射芯片的訪問。在生成的驅(qū)動框架中已經(jīng)完成對于資源的定義、初始化及卸載,只需要在DeviceIoControl控制代碼函數(shù)中加入對于資源的讀寫即可。

      資源定義代碼如下:

      KMemoryRange m_MemoryRange0;

      KMemoryRange m_MemoryRange2;

      在使用資源前,需要對資源進行初始化,將WDM中得到的PCI總線配置機構(gòu)分配的物理內(nèi)存轉(zhuǎn)換成系統(tǒng)可以訪問的非分頁內(nèi)存,驅(qū)動框架中的OnStartDevice函數(shù)已經(jīng)提供了該操作:

      status = m_IoPortRange0.Initialize(

      pResListTranslated,

      pResListRaw,

      PciConfig.BaseAddressIndexToOrdinal(0)

      );

      初始化后,就可以通過類中自帶的硬件訪問函數(shù)來設(shè)置內(nèi)存:

      m_MemoryRange0.outd(INTCSR,0);

      m_MemoryRange2.ind(Offset,pOutBuffer,count);

      在驅(qū)動停止運行之前,需要對于資源進行卸載操作,驅(qū)動框架已經(jīng)在Invalidate函數(shù)中提供:

      m_MemoryRange0.Invalidate();

      m_MemoryRange2.Invalidate();

      (b) 中斷處理

      KInterrupt類實現(xiàn)硬件中斷處理。其成員函數(shù)包括中斷的初始化,及將一個中斷服務(wù)例程連接到一個中斷和解除其連接的操作等。

      中斷服務(wù)例程不是KInterrupt類的成員函數(shù),這樣做的目的是減少中斷延遲時間。

      中斷處理需要中斷服務(wù)例程和延遲過程調(diào)用例程,需要聲明,在驅(qū)動程序框架中已經(jīng)提供:

      MEMBER_ISR(PCIRegDevice, Isr_Irq);

      MEMBER_DPC(PCIRegDevice, DpcFor_Irq);

      BOOLEAN Isr_Irq(void);

      VOID DpcFor_Irq(PVOID Arg1, PVOID Arg2);

      KInterrupt m_Irq;

      KDeferredCall m_DpcFor_Irq;

      驅(qū)動程序框架在OnStartDevice函數(shù)中初始化中斷變量并調(diào)用宏LinkTo連接中斷例程:

      status = m_Irq.InitializeAndConnect(

      pResListTranslated,

      LinkTo(Isr_Irq),

      this

      );

      m_DpcFor_Irq.Setup(LinkTo(DpcFor_Irq), this);

      在中斷服務(wù)例程中,首先判斷該中斷是否為需要處理的中斷,若不是,返回False;若是,進行必要的處理,請求一個DPC,然后返回True。這里需要處理的是DMA中斷,因此Isr_Irq函數(shù)判斷的是中斷寄存器(PCI9656中為0x68[11])的某個特定位是否為1。

      在驅(qū)動程序停止前,需要調(diào)用KInterrupt成員函數(shù)來斷開中斷并釋放資源:

      m_Irq.Disconnect();

      Invalidate();

      (c) DMA傳輸

      DriverWorks提供了三個類:KDmaAdapter 、KDmaTransfer和KCommonDmaBuffer類,用于實現(xiàn)DMA操作。KDmaAdapter類用于建立一個DMA適配器,它說明DMA通道的特性。KDmaTransfer類用于DMA傳輸控制。KCommonDmaBuffer類用于申請系統(tǒng)提供的公用緩沖區(qū)。具體參數(shù)的定義與初始化在驅(qū)動框架中提供。

      DMA傳輸編程通常涉及SerialRead/Serial Write、OnDmaReady、StartDMA、Isr_Irq和DqcFor_Irq例程。其中DMA準備就緒回調(diào)例程,至少會調(diào)用兩次。

      第一步在SerialRead/SerialWrite中啟動DMA讀寫傳輸:

      status = m_CurrentTransfer->Initiate(

      this,

      &m_Dma,

      I.Mdl(),

      (I.MajorFunction() == IRP_MJ_READ) ? FromDeviceToMemory : FromMemoryToDevice,

      LinkTo(OnDmaReady),

      &m_Buffer

      ); //此操作將使系統(tǒng)調(diào)用OnDmaReady例程

      第二步,獲取要傳輸?shù)奈锢韮?nèi)存的地址和字節(jié)數(shù),調(diào)用StartDMA例程:

      StartDMA(ptd->td_PhysAddr.LowPart,ptd->td_Length, readTag);

      第三步,DMA傳輸結(jié)束后,產(chǎn)生中斷,Isr_Irq例程處理并清除中斷后,請求DqcFor_Irq例程:

      m_MemoryRange0.outd(DMAMODE0,0x20800);//先禁止中斷

      m_MemoryRange0.outb(DMACSR0,0x10);

      //再清除中斷

      if (!m_DpcFor_Irq.Request(NULL, NULL))

      {

      }

      第四步,DMA結(jié)束,完成IRP。

      如此四步,完成DMA傳輸。

      (3) 調(diào)用驅(qū)動程序完成所需功能

      本文需要對于多塊超聲回波信號的數(shù)據(jù)采集板進行寄存器讀寫和DMA讀寫,而由于并不需要調(diào)用庫函數(shù),因此需要開發(fā)的應(yīng)用程序框架如圖8所示。

      (a) 打開設(shè)備

      由于驅(qū)動框架生成過程中選擇的是通過符號鏈接名的方法打開設(shè)備,因此當所有數(shù)字板都裝上生成的驅(qū)動后,板卡命名規(guī)律是“PCI9656Device+數(shù)字位”,其數(shù)字位自動+1,如第1塊板卡的符號鏈接名是“PCI9656Device0”,第2塊板卡就是“PCI9656Device1”,依此類推,第N塊板卡是“PCI9656DeviceN-1”。通過CreateFile函數(shù)得到驅(qū)動句柄:

      char *sLinkName[N] = {"\\.\PCIRegDevice0", "\\.\PCIRegDevice1", ..., "\\.\PCIRegDeviceN-1", "\\.\PCIRegDeviceN"};

      CreateFile(sLinkName[itag],

      GENERIC_READ | GENERIC_WRITE,

      FILE_SHARE_READ,

      NULL,

      OPEN_EXISTING, 0, NULL);

      通過修改itag參數(shù)來打開不同的板卡,在此基礎(chǔ)上可以通過枚舉識別插入板卡數(shù)目。

      (b) 訪問設(shè)備資源

      通過DeviceIoControl函數(shù)與WDM驅(qū)動進行通信,對其進行設(shè)置寄存器和DMA地址的操作。

      使用ReadFile和WriteFile函數(shù)進行讀寫DMA的操作,由于ReadFile/WriteFile有固定的輸入?yún)?shù),因此DMA地址如果不固定的話,需要由DeviceIoControl函數(shù)修改。

      (c) 關(guān)閉設(shè)備

      通過CloseHandle函數(shù)關(guān)閉設(shè)備。

      3 WDF驅(qū)動開發(fā)

      3.1 WDF驅(qū)動模型介紹

      WDF(Windows Driver Foundation)是微軟在WDM基礎(chǔ)上改進而來的最新一代驅(qū)動程序模型。它采用基于對象的技術(shù),精心設(shè)計了對象模型并進行了封裝,為驅(qū)動程序設(shè)計人員提供了面向?qū)ο?、事件?qū)動的驅(qū)動程序開發(fā)框架[12]。WDF改變了操作系統(tǒng)內(nèi)核與驅(qū)動程序之間的關(guān)系,WDM驅(qū)動程序中,一方面要處理硬件,另一方面要處理驅(qū)動程序與操作系統(tǒng)內(nèi)核的交互。而WDF則將驅(qū)動程序與操作系統(tǒng)內(nèi)核之間進行了分離,驅(qū)動程序與操作系統(tǒng)交互工作交給框架內(nèi)封裝的方法完成[13],這樣驅(qū)動開發(fā)者只需專注處理硬件的行為即可,避免了直接與操作系統(tǒng)內(nèi)核交互,不僅大大簡化了驅(qū)動程序的編程,還提高了整個系統(tǒng)的可靠性和穩(wěn)定性。

      WDF有KMDF(Kernel-Mode Driver Framework)和UMDF(User-Mode Driver Framework)兩種模式,其中前者用于內(nèi)核模式,后者用于用戶模式。而需要開發(fā)的PCI9656驅(qū)動使用的是KMDF模式,代碼效率較高。

      3.2 WDF驅(qū)動開發(fā)步驟

      與WDM驅(qū)動開發(fā)類似,WDF驅(qū)動開發(fā)也有三個步驟:

      (1) 生成驅(qū)動框架

      本文所用的開發(fā)環(huán)境為Microsoft Windows Driver Kit(WDK) 7.1.0.7600和Visual C++ 6.0。由于微軟并沒有提供創(chuàng)建KMDF框架驅(qū)動程序的工具,因此當要創(chuàng)建一個KMDF驅(qū)動程序時,需要按照以下步驟進行。

      (a) 從已安裝的WDK目錄下src文件中拷貝一個KMDF實例驅(qū)動程序到自己創(chuàng)建的文件夾目錄下。由于開發(fā)的是PLX公司的PCI9656的驅(qū)動,因此可以選擇general文件夾下的PLX9x5x文件夾。

      (b) 將dirs文件中內(nèi)容修改為:DIRS=sys。

      (c) 將該實例驅(qū)動程序中驅(qū)動程序文件名與安裝程序文件名修改為自己需要的文件名。

      (d) 利用GUIDGEN生成設(shè)備接口GUID,并根據(jù)需要定義設(shè)備IO命令。

      (2) 在生成的驅(qū)動框架下添加功能代碼

      (a) 硬件訪問

      KMDF提供了訪問存儲器映射設(shè)備的函數(shù),驅(qū)動程序需根據(jù)配置空間定義地址指針。驅(qū)動程序編寫主要包括以下步驟:

      (i) 根據(jù)配置定義地址指針。

      typedef struct _DEVICE_EXTENSION {

      PPCI9656_REGS Regs; // Registers address

      PUCHAR RegsBase; // Registers base address

      ULO RegsLength; // Registers base length

      PUCHAR SRAMBase; // SRAM base address

      ULONG SRAMLength; // SRAM base length

      } DEVICE_EXTENSION, *PDEVICE_EXTENSION;

      需要讀寫的為Bar0與Bar2的兩塊存儲器空間。

      (ii) 在PLxPrepareHardware例程中,初始化地址指針。

      首先用WdfCmResourceListGetCount函數(shù)獲取配置資源個數(shù),用WdfCmResourceListGetDescriptor函數(shù)獲取該資源描述符,其類型屬性Type包括CmResoureTypePort(I/O端口)、CmResourceType Memory(存儲器)等。對于存儲器地址,要先用MmMapIoSpace函數(shù)將物理地址轉(zhuǎn)換成系統(tǒng)內(nèi)核模式地址,然后保存在之前定義的指針中。

      (iii) 在PLxEvtDeviceReleaseHardware例程中,對于存儲器地址,要用MmUnmIoSpace函數(shù)解除物理地址與系統(tǒng)內(nèi)核模式地址的關(guān)聯(lián)。

      (iv) 當需要訪問存儲器空間時,可使用KMDF提供的函數(shù)。

      WRITE_REGISTER_ULONG((PULONG)(pReg+n),value);

      其中參數(shù)都是由應(yīng)用程序設(shè)置并通過DeviceIoControl傳輸給驅(qū)動程序。

      (b) 中斷處理

      DMA傳輸結(jié)束后會產(chǎn)生中斷,需要對這個中斷進行處理。KMDF中使用WDFINTERRUPT對象實現(xiàn)硬件中斷的處理。

      中斷處理主要包括以下3個步驟:

      (i) 在設(shè)備環(huán)境變量結(jié)構(gòu)中聲明中斷對象。

      WDFINTERRUPT Interrupt;

      (ii) 在EvtDeviceAdd例程中,創(chuàng)建中斷對象。

      WDF_INTERRUPT_CONFIG_INIT( &InterruptConfig, PLxEvtInterruptIsr, PLxEvtInterruptDpc );

      status = WdfInterruptCreate( DevExt->Device, &InterruptConfig, WDF_NO_OBJECT_ATTRIBUTES, &DevExt->Interrupt );

      (iii) 中斷服務(wù)例程編程。

      在中斷服務(wù)例程中,首先判斷該中斷是否是需要處理的中斷,在本例中即為是否DMA結(jié)束,若不是,則返回FALSE;若是,則進行必要的處理,并返回TRUE。

      (c) DMA傳輸

      KMDF提供了三個對象實現(xiàn)DMA操作:WDFDMAENABLER、WDFDMATRANSACTION和WDFCOMMONBUFFER。WDFDMAENABLER對象用于建立一個DMA適配器,它說明DMA通道的特性;WDFDMATRANSACTION對象用于DMA傳輸控制;WDFCOMMONBUFFER對象用于申請系統(tǒng)提供的公用緩沖區(qū)。

      DMA傳輸?shù)木唧w步驟如下:

      (i) 在設(shè)備環(huán)境變量結(jié)構(gòu)中聲明三個對象。

      (ii) 在PLxEvtDeviceAdd例程中分別使用WdfDmaEnablerCreate、WdfCommonBufferCreate和WdfDmaTransactionCreate例程創(chuàng)建DMA的三個對象。

      (iii) DMA傳輸編程。

      當有I/O請求時,在PLxEvtIoRead/PLxEvtIoWrite

      例程中,用WdfDmaTransactionInitializeUsingRequest

      或WdfDmaTransactionInitialize函數(shù)初始化DMA傳輸,調(diào)用WdfDmaTransactionExecute函數(shù),啟動DMA傳輸。

      在函數(shù)

      PlxEvtProgramReadDma/PLxEvtProgramWriteDma中,對于硬件的DMA操作寄存器進行設(shè)置。

      當DMA傳輸中斷發(fā)生后,在PLxEvtInterruptDpc

      例程中,判斷DMA傳輸是否結(jié)束,沒有則調(diào)用WdfDmaTransactionExecute函數(shù),繼續(xù)啟動DMA傳輸;若DMA傳輸結(jié)束,則完成I/O請求。

      (3) 調(diào)用驅(qū)動程序完成所需功能

      本文需要對于多塊超聲回波信號數(shù)據(jù)采集板進行寄存器讀寫和DMA讀寫,因此需要開發(fā)的應(yīng)用程序框架如圖9所示。

      (a) 打開設(shè)備

      通過SetupDiEnumDeviceInterfaces函數(shù)中MemberIndex參數(shù)來設(shè)置板卡號,在GetDevicePath中得到設(shè)備路徑并以此作為CreateFile函數(shù)的參數(shù)打開設(shè)備。

      (b) 訪問設(shè)備資源

      與WDM類似,使用DeviceIoControl函數(shù)設(shè)置寄存器值與DMA地址,使用ReadFile/WriteFile讀寫DMA。

      (c) 關(guān)閉設(shè)備

      與WDM類似,使用CloseHandle函數(shù)關(guān)閉設(shè)備。

      4 超聲相控陣系統(tǒng)PCI驅(qū)動方式的選擇

      在本文所涉及的超聲相控陣系統(tǒng)中測試開發(fā)的驅(qū)動,系統(tǒng)環(huán)境為Windows XP。

      測試表明,采用WinDriver、DriverStudio和WDK開發(fā)的PCI9656驅(qū)動都能夠正確的讀寫設(shè)備資源。

      通過比較DMA讀寫的最大傳輸速率來間接判斷驅(qū)動代碼效率,見表1。

      表1 DMA讀寫最大傳輸速率

      通過表1可以看出,采用WinDriver開發(fā)的WDM驅(qū)動由于調(diào)用的是WinDriver本身提供庫函數(shù),代碼效率較低,DMA最大傳輸速率為25 MB/s,在要求高速傳輸?shù)臈l件下并不適用;采用DriverStudio開發(fā)的WDM驅(qū)動傳輸速率為121 MB/s,與WDK開發(fā)的WDF驅(qū)動相似,這是由于WDF驅(qū)動本質(zhì)上只是對于WDM進行封裝,并沒有效率上的提高或降低。

      由于超聲相控陣系統(tǒng)需要高速實時傳輸,即對于PCI數(shù)據(jù)總線的驅(qū)動效率有一定的要求,排除了采用WinDriver的開發(fā)方案;并且我們開發(fā)的超聲相控陣系統(tǒng)所采用的操作系統(tǒng)為Windows XP,而采用WDK開發(fā)的WDF驅(qū)動模型為Vista及其以后操作系統(tǒng)的驅(qū)動模型,為了保障系統(tǒng)與驅(qū)動的兼容性,排除了采用WDK的開發(fā)方案。因此,本文選擇DriverStudio開發(fā)超聲相控陣系統(tǒng)PCI驅(qū)動,能夠穩(wěn)定并且高速傳輸超聲探傷數(shù)據(jù)。

      5 結(jié)論

      本文基于實驗室自行開發(fā)的超聲相控陣系統(tǒng),詳細闡述了采用WinDriver、DriverStudio和WDK這三種工具開發(fā)PCI數(shù)據(jù)總線驅(qū)動的方案。通過比較三種開發(fā)方案,并考慮超聲相控陣系統(tǒng)對于驅(qū)動的要求,選擇DriverStudio開發(fā)PCI數(shù)據(jù)總線驅(qū)動。實驗表明,開發(fā)的驅(qū)動能夠高速穩(wěn)定地工作,滿足系統(tǒng)要求。由于不同的應(yīng)用有著不同的開發(fā)需求,可以根據(jù)特定的開發(fā)需求選擇不同的開發(fā)方案,從而得到需要的驅(qū)動及其應(yīng)用程序。

      [1] 燕會明. 超聲相控陣技術(shù)及其應(yīng)用研究[D]. 太原: 中北大學(xué), 2008: 14-15.

      YAN Huiming. Research on technique and application in ultrasonic phased array[D]. Taiyuan: Zhongbei University, 2008: 14-15.

      [2] 尹勇, 李宇. PCI總線設(shè)備開發(fā)寶典[M]. 北京: 北京航空航天大學(xué)出版社, 2005.

      YIN Yong, LI Yu. PCI bus equipment development collections[M]. Beijing: Beijing University of Aeronautics and Astronautics, 2005.

      [3] 毛清華. 基于PCI總線的超聲檢測系統(tǒng)研究[D]. 西安: 西安科技大學(xué), 2010: 5-10.

      MAO Qinghua. Research on ultrasonic testing system based on PCI bus[D]. Xi'an: Xi'an university of science and technology, 2010: 5-10.

      [4] 劉伊威, 金明河, 樊紹巍, 等. 五指仿人機器人靈巧手DLR/HIT Hand II[J]. 機械工程學(xué)報, 2009, 45(11): 10-17.

      LIU Yiwei, JIN Minghe, FAN Shaowei, et al. Five-finger dextrous robot hand DLR/HIT HAND II[J]. Journal of Mechanical Engineering, 2009, 45(11): 10-17.

      [5] 張益東. 基于PCI總線的光傳飛行控制系統(tǒng)研究[D]. 南京: 南京航空航天大學(xué), 2007: 5-8.

      ZHANG Yidong. Research on fly-by-light control system based on PCI bus[D]. Nanjing: Nanjing University of Aeronautics and Astronautics, 2007: 5-8.

      [6] 張帆, 史彩成. Windows驅(qū)動開發(fā)技術(shù)詳解[M]. 北京: 電子工業(yè)出版社, 2008.

      ZHANG Fan, SHI Caicheng. Windows driver development internals[M]. Beijing: Electronic Industry Press, 2008.

      [7] 何柳, 陳勇, 吳斌, 等. PCI/PCI-E高速實時DMA傳輸驅(qū)動設(shè)計[J]. 電子技術(shù)應(yīng)用, 2012, 38(11): 143-145.

      HE Liu, CHEN Yong, WU Bing, et al. Design a high speed and real time PCI/PCI-E DMA transmission driver[J]. Application of Electronic Technique, 2012, 38(11): 143-145.

      [8] 楊波. 基于PCI總線的WDM驅(qū)動程序開發(fā)研究[D]. 長沙: 國防科學(xué)技術(shù)大學(xué), 2007: 32-33.

      YANG Bo. The research on developing WDM driver of PCI bus[D]. Changsha: National University of Defense Technology, 2007: 32-33.

      [9] 王磊, 魯新平, 李吉成. WinDriver在開發(fā)基于PLX9056芯片的PCI設(shè)備驅(qū)動程序中的應(yīng)用[J]. 現(xiàn)代電子技術(shù), 2006, 29(18): 77-79.

      WANG Lei, LU Xinping, LI Jicheng. Application of WinDriver in developing PCI device driver based on PLX9056[J]. Modern Electronics Technique, 2006, 29(18): 77-79.

      [10] 鄭秀玉, 李曉明, 李暢, 等. 基于PCI總線的數(shù)據(jù)采集卡驅(qū)動程序設(shè)計與實現(xiàn)[J]. 電氣應(yīng)用, 2007, 26(1): 93-107.

      ZHENG Xiuyu, LI Xiaoming, LI Chang, et al. The driver development and implement of data sample card based on PCI bus[J]. Electrotechnical Application, 2007, 26(1): 93-107.

      [11] PLX Technology, Inc. PCI9656BA Data Book[EB/OL]. [2009-01]. http://www.plxtech.com.

      [12] Orwick P, Smith G. Developing drivers with the Microsoft windows driver foundation[M]. Microsoft Press, 2007.

      [13] 鄒敬軒, 蔡皖東. 基于WDF過濾驅(qū)動的USB存儲設(shè)備監(jiān)控系統(tǒng)[J]. 計算機工程與科學(xué), 2010, 32(3): 42-71.

      ZOU Jingxuan, CAI Wandong. A USB storage device monitor and control system based on the WDF filter driver[J]. Computer Engineering & Science, 2010, 32(3): 42-71.

      Research on PCI driver development in ultrasonic phased array system

      SHI Cheng-long, SHI Fang-fang, KONG Chao, ZHANG Bi-xing

      (State Key Laboratory of Acoustics, Institute of Acoustics, Chinese Academy of Sciences, Beijing 100190, China)

      The data transmission rate of ultrasonic phased array system determines the detection speed to a great extent. As a result, the efficiency of PCI device driver is critical in the ultrasonic phased array system based on PCI local bus. The developing methods and implementations of PCI device drivers using three different development tools, WinDriver,DriverStudio and WDK(Windows Driver Kit), are expounded in detail. The efficiency and compatibility of drivers by adapting different solutions are compared. Experimental results show that both the stability and data transmission rate of the driver developed by DriverStudio can meet the requirements of the ultrasonic phased array system. There are different requirements in different applications. As so, one should choose the developing solution comprehensively according to the specific requests to obtain the proper device driver and application program.

      phased array; PCI bus; device driver

      TB51+7

      A

      1000-3630(2015)-03-0252-08

      10.3969/j.issn1000-3630.2015.03.013

      2015-02-14;

      2015-05-20

      國家自然科學(xué)基金資助項目(11374324、11174321)

      施成龍(1988-), 男, 江蘇南通人, 博士研究生, 研究方向為超聲傳播與成像。

      師芳芳, E-mail: fangfangshi@mail.ioa.ac.cn

      猜你喜歡
      驅(qū)動程序相控陣中斷
      相控陣超聲技術(shù)在PE管電熔焊接檢測的應(yīng)用
      煤氣與熱力(2021年3期)2021-06-09 06:16:16
      相控陣超聲波檢測技術(shù)認證
      化工管理(2021年7期)2021-05-13 00:45:20
      一種相控陣雷達的通訊處理器設(shè)計
      電子制作(2019年24期)2019-02-23 13:22:16
      相控陣雷達研究現(xiàn)狀與發(fā)展趨勢
      電子測試(2018年15期)2018-09-26 06:01:46
      跟蹤導(dǎo)練(二)(5)
      千里移防,衛(wèi)勤保障不中斷
      解放軍健康(2017年5期)2017-08-01 06:27:44
      AT89C51與中斷有關(guān)的寄存器功能表解
      FPGA內(nèi)嵌PowerPC的中斷響應(yīng)分析
      微處理機(2012年4期)2012-06-13 11:32:24
      驅(qū)動程序更新與推薦
      驅(qū)動程序更新與推薦
      金寨县| 抚顺县| 丽水市| 松潘县| 通辽市| 龙门县| 株洲市| 县级市| 民丰县| 涞水县| 通化市| 浮山县| 铁力市| 定襄县| 新源县| 历史| 论坛| 普格县| 禄丰县| 塔河县| 长垣县| 竹溪县| 和静县| 丹凤县| 冷水江市| 东丽区| 襄樊市| 柳州市| 曲松县| 正蓝旗| 甘洛县| 青神县| 贵州省| 吉木萨尔县| 霍林郭勒市| 淮南市| 邳州市| 嘉善县| 太和县| 连城县| 江都市|