• 
    

    
    

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

      ?

      PXIe 接口可重構(gòu)測(cè)試儀器的驅(qū)動(dòng)程序開(kāi)發(fā)

      2021-04-21 12:42王法臻崔少輝
      現(xiàn)代電子技術(shù) 2021年8期
      關(guān)鍵詞:驅(qū)動(dòng)程序內(nèi)核調(diào)用

      王法臻,崔少輝,王 成

      (陸軍工程大學(xué)石家莊校區(qū),河北 石家莊 050003)

      0 引 言

      測(cè)試總線PXIe 在PCIe 總線上擴(kuò)展了觸發(fā)、定時(shí)等功能,是PCIe 總線在儀器領(lǐng)域上的擴(kuò)展。PXIe 采用串行、點(diǎn)對(duì)點(diǎn)的連接方式實(shí)現(xiàn)設(shè)備間的通信,其背板帶寬[1]可達(dá)6 Gb/s,還能提供差分時(shí)鐘和同步,提高了儀器時(shí)鐘的抗噪聲性能。因此,PXIe 總線廣泛適用于測(cè)試、控制、高帶寬數(shù)據(jù)傳輸?shù)刃枰咚佟⒏邘挼念I(lǐng)域。要實(shí)現(xiàn)PXIe 總線設(shè)備與上位機(jī)的通信,就需要開(kāi)發(fā)相應(yīng)的驅(qū)動(dòng)程序。驅(qū)動(dòng)程序是操作系統(tǒng)的組成部分,是直接與硬件溝通的媒介。

      基于此,本文開(kāi)發(fā)了一種PXIe 接口可重構(gòu)測(cè)試儀器的驅(qū)動(dòng)程序。在實(shí)際測(cè)試中將儀器插入PXIe 機(jī)箱中進(jìn)行調(diào)試,驅(qū)動(dòng)程序運(yùn)行穩(wěn)定可靠,成功實(shí)現(xiàn)了控制指令發(fā)送和數(shù)據(jù)傳輸?shù)墓δ堋?/p>

      1 PXIe 接口可重構(gòu)儀器

      傳統(tǒng)ATS 采用平臺(tái)加適配器的共享資源架構(gòu),通過(guò)開(kāi)關(guān)系統(tǒng)分配測(cè)試通道和資源,開(kāi)關(guān)延遲、測(cè)試資源競(jìng)爭(zhēng)和死鎖等問(wèn)題不可避免。解決上述問(wèn)題可采用專(zhuān)用資源架構(gòu),使得各個(gè)測(cè)試通道均具備在任何時(shí)刻可提供所有測(cè)試資源的能力,為此,可重構(gòu)儀器提供了良好的解決方案。PXIe 接口可重構(gòu)儀器以Cyclone IV GX 系列FPGA 為核心,具備數(shù)模轉(zhuǎn)換、模數(shù)轉(zhuǎn)換、波形產(chǎn)生和電壓比較等功能。儀器通過(guò)接收上位機(jī)經(jīng)PXIe 總線向下發(fā)送的指令,選擇和設(shè)置各測(cè)試通道的功能和參數(shù),同時(shí)將測(cè)量數(shù)據(jù)上傳至上位機(jī)進(jìn)行處理。

      PXIe 同PCIe 遵循相同的協(xié)議,是在PCIe 總線基礎(chǔ)上附加必要的時(shí)鐘信號(hào)、觸發(fā)總線、星形總線、本地總線等PXIe 擴(kuò)展信號(hào)形成的[2]。因此,可重構(gòu)儀器通過(guò)PCIe IP 硬核設(shè)計(jì)實(shí)現(xiàn)PXIe 接口。該實(shí)現(xiàn)方式在保證較大傳輸帶寬的基礎(chǔ)上,可簡(jiǎn)化電路設(shè)計(jì),降低開(kāi)發(fā)成本。若要通過(guò)PXIe 總線實(shí)現(xiàn)上位機(jī)與儀器的通信,設(shè)計(jì)可靠穩(wěn)定的驅(qū)動(dòng)程序顯得十分關(guān)鍵[3]。

      2 驅(qū)動(dòng)程序設(shè)計(jì)

      2.1 開(kāi)發(fā)環(huán)境搭建

      在Windows 7 x64 操作系統(tǒng)下安裝VS2013 搭配WDK8.1 工具包完成開(kāi)發(fā)環(huán)境的搭建。該集成開(kāi)發(fā)環(huán)境具有用于開(kāi)發(fā)、編譯、生成以及調(diào)試驅(qū)動(dòng)程序所需的配套工具。

      2.2 WDF 驅(qū)動(dòng)框架

      WDF 驅(qū)動(dòng)框架是微軟最新的驅(qū)動(dòng)開(kāi)發(fā)框架,是在WDM 驅(qū)動(dòng)模型的基礎(chǔ)上進(jìn)一步封裝發(fā)展而來(lái),具備了真正意義上面向?qū)ο?、事件?qū)動(dòng)的性質(zhì)特點(diǎn)[4?5]。

      WDF 驅(qū)動(dòng)框架負(fù)責(zé)管理與操作系統(tǒng)內(nèi)核相關(guān)的多數(shù)交互,實(shí)現(xiàn)了對(duì)電源管理、即插即用等公共功能的支持,從而隔離了驅(qū)動(dòng)程序與操作系統(tǒng)內(nèi)核,而降低了驅(qū)動(dòng)程序?qū)Σ僮飨到y(tǒng)內(nèi)核的影響[6]。

      WDF 框架內(nèi)部由對(duì)象模型和事件回調(diào)例程構(gòu)建組成,框架中所有的事物諸如設(shè)備、中斷、I/O 請(qǐng)求等都由對(duì)象定義。對(duì)象模型的實(shí)現(xiàn)使得各個(gè)對(duì)象都具有相應(yīng)的屬性、方法和事件,因此可圍繞對(duì)象完成參數(shù)的獲取設(shè)置、觸發(fā)特定事件回調(diào)例程等各類(lèi)操作。WDF 包括KMDF 和UMDF 兩種驅(qū)動(dòng)框架模式,分別運(yùn)行在操作系統(tǒng)內(nèi)核環(huán)境和用戶(hù)環(huán)境下。PXIe 驅(qū)動(dòng)程序運(yùn)行在操作系統(tǒng)內(nèi)核中,因而采用KMDF 模式進(jìn)行開(kāi)發(fā)[7]。PXIe 驅(qū)動(dòng)程序的開(kāi)發(fā)流程如圖1 所示。

      圖1 PXIe 驅(qū)動(dòng)程序開(kāi)發(fā)流程

      DriverEntry 例程作為驅(qū)動(dòng)程序的入口,負(fù)責(zé)驅(qū)動(dòng)程序框架的初始化,在系統(tǒng)第一次加載驅(qū)動(dòng)程序時(shí)被調(diào)用創(chuàng)建驅(qū)動(dòng)對(duì)象并設(shè)置PXIeEvtDeviceAdd 例程。PXIeEvtDeviceAdd 例程負(fù)責(zé)創(chuàng)建各類(lèi)對(duì)象并完成初始化I/O 隊(duì)列、初始化中斷處理等工作。

      驅(qū)動(dòng)程序主要實(shí)現(xiàn)6 類(lèi)功能:I/O 請(qǐng)求處理、硬件訪問(wèn)、DMA 操作、中斷處理、設(shè)置Event 事件以及電源狀態(tài)管理。

      3 驅(qū)動(dòng)程序功能實(shí)現(xiàn)

      3.1 I/O 請(qǐng)求處理

      上位機(jī)應(yīng)用程序通過(guò)I/O 請(qǐng)求實(shí)現(xiàn)與驅(qū)動(dòng)程序的通信[8]。在WDF 驅(qū)動(dòng)框架中,各類(lèi)I/O 請(qǐng)求會(huì)被封裝成WDFREQUEST 對(duì)象放入I/O 隊(duì)列中進(jìn)行排隊(duì)。驅(qū)動(dòng)采用了框架的默認(rèn)串行隊(duì)列,會(huì)按照先后順序自動(dòng)調(diào)用對(duì)應(yīng)類(lèi)型的I/O 處理例程進(jìn)行處理。

      PXIeEvtIoRead 例 程 、PXIeEvtIoWrite 例 程 、PXIeDeviceIoControl 例程分別負(fù)責(zé)對(duì)硬件的讀訪問(wèn)、寫(xiě)訪問(wèn)和DMA 操作。

      3.2 硬件訪問(wèn)

      硬件訪問(wèn)具體就是對(duì)BAR 空間的訪問(wèn),完成對(duì)各功能寄存器的設(shè)置,如設(shè)置DMA 配置寄存器啟動(dòng)DMA傳輸,設(shè)置通道控制寄存器選擇信號(hào)通道等[9]。

      驅(qū)動(dòng)程序只有在實(shí)現(xiàn)設(shè)備內(nèi)存地址空間的映射后才能對(duì)硬件進(jìn)行訪問(wèn)。驅(qū)動(dòng)程序在PXIeEvtDeviceAdd例程中創(chuàng)建并初始化PNP 及電源管理對(duì)象,通過(guò)PNP 及電源管理例程來(lái)建立硬件資源與系統(tǒng)的映射關(guān)系。

      在驅(qū)動(dòng)加載時(shí),WDF 驅(qū)動(dòng)框架便會(huì)調(diào)用PXIeEvtDevicePrepareHardware 例程來(lái)獲取設(shè)備的內(nèi)存地址空間。由于PXIe 接口的BAR 空間被配置為存儲(chǔ)器空間,所以不再處理I/O 端口資源和中斷資源。此時(shí),對(duì)BAR 空間的物理地址映射必須調(diào)用MmMapIoSpace,將物理地址轉(zhuǎn)換成操作系統(tǒng)內(nèi)核模式下的虛擬地址。之后,驅(qū)動(dòng)程序便可通過(guò)虛擬地址讀/寫(xiě)B(tài)AR 空間相應(yīng)地址上的寄存器。PXIeEvtDevicePrepareHardware 例程獲取設(shè)備內(nèi)存地址空間的流程如圖2 所示。

      圖2 獲取內(nèi)存地址空間流程

      在完成映射的基礎(chǔ)上,當(dāng)驅(qū)動(dòng)程序收到應(yīng)用程序調(diào)用PXIeEvtIoRead 例程或PXIeEvtIoWrite 例程的I/O 請(qǐng)求后,可使用函數(shù)READ_REGISER_XXX 或WRITE_REGISER_XXX 訪問(wèn)映射地址進(jìn)行讀寫(xiě)操作。

      在移除設(shè)備驅(qū)動(dòng)程序時(shí),需在PXIeEvtDevice?ReleaseHardware 例程中調(diào)用MmUnmapIoSpace 解除內(nèi)存物理地址與系統(tǒng)虛擬地址的映射關(guān)系。

      3.3 DMA 傳輸及中斷處理

      大量數(shù)據(jù)的高速傳輸采用直接存儲(chǔ)器訪問(wèn)(Direct Memory Access,DMA)方式。由于在FPGA 中已經(jīng)實(shí)現(xiàn)DMA 控制器的設(shè)計(jì),因此驅(qū)動(dòng)程序僅考慮提供傳輸所需的內(nèi)存空間和DMA 配置寄存器信息即可。DMA 操作流程如圖3 所示。

      3.3.1 創(chuàng)建DMA 傳輸對(duì)象

      驅(qū)動(dòng)程序初始化時(shí),在PXIeEvtDevcieAdd 例程中創(chuàng)建WDFDMAENABLER 對(duì)象并說(shuō)明DMA 通道的特性;同時(shí)創(chuàng)建對(duì)象WDFCOMMONBUFFER,向系統(tǒng)申請(qǐng)公共緩沖區(qū),即用一段物理地址上的連續(xù)內(nèi)存作為讀/寫(xiě)內(nèi)存空間。此外還需創(chuàng)建WDFDMATRANSACTION 對(duì)象用于DMA 傳輸事務(wù)的控制。

      3.3.2 DMA 傳輸事務(wù)初始化

      當(dāng)驅(qū)動(dòng)程序接收應(yīng)用程序,調(diào)用PXIeDeviceIoControl處理例程,發(fā)起DMA 操作的I/O 請(qǐng)求后,調(diào)用WdfDmaTransactionInitialize 注 冊(cè)PXIeEvtProgramDma 例程,完成DMA 傳輸事務(wù)的初始化。

      圖3 DMA 操作流程

      在PXIeEvtProgramDma 例程中需依次配置DMA 數(shù)據(jù)傳輸首地址、數(shù)據(jù)傳輸長(zhǎng)度以及中斷服務(wù)寄存器,最后配置讀/寫(xiě)操作控制寄存器,用于通知設(shè)備啟動(dòng)DMA傳輸。該例程在執(zhí)行啟動(dòng)DMA 傳輸事務(wù)后被調(diào)用執(zhí)行。

      3.3.3 啟動(dòng)DMA 傳輸

      調(diào)用函數(shù)WdfDmaTransactionExecute執(zhí)行啟動(dòng)DMA傳輸事務(wù)后,注冊(cè)例程PXIeEvtProgramDma 隨即被調(diào)用完成各寄存器的配置并啟動(dòng)DMA 傳輸。

      3.3.4 中斷處理

      DMA 傳輸完成時(shí),設(shè)備會(huì)向上位機(jī)發(fā)出中斷信號(hào),驅(qū)動(dòng)程序需響應(yīng)中斷并進(jìn)行相關(guān)處理。驅(qū)動(dòng)程序通過(guò)中斷對(duì)象WDFINTERRUPT 實(shí)現(xiàn)上述需求。該對(duì)象在PXIeEvtDeviceAdd 例程中創(chuàng)建并初始化,并與中斷處理例程、延遲調(diào)用例程相關(guān)聯(lián)。中斷處理流程如圖4所示。

      由于中斷服務(wù)例程處于硬件中斷DIRQL 級(jí)別上運(yùn)行,長(zhǎng)時(shí)間處于該例程會(huì)影響其他線程運(yùn)行,且很多內(nèi)核函數(shù)無(wú)法被調(diào)用。因此完成中斷信號(hào)的判斷后,可調(diào)用運(yùn)行在DISPATCH_LEVEL 級(jí)別上的延遲調(diào)用例程完成后續(xù)處理工作。

      結(jié)合上述情況,中斷處理包含了中斷處理例程和延遲調(diào)用例程兩個(gè)部分。中斷處理例程的任務(wù):

      1)判斷中斷信號(hào)來(lái)源是否由設(shè)備產(chǎn)生,通過(guò)讀取中斷服務(wù)寄存器的方式實(shí)現(xiàn)。由于設(shè)備采用INTx 中斷方式,共享中斷機(jī)制可能與其他設(shè)備共享中斷號(hào),從而導(dǎo)致中斷信號(hào)并非來(lái)源于指定設(shè)備[10]。

      2)清除中斷信號(hào),若中斷信號(hào)由設(shè)備產(chǎn)生則必須清除中斷標(biāo)志,即設(shè)置中斷服務(wù)寄存器至初始狀態(tài)。避免因清除不及時(shí)導(dǎo)致一個(gè)中斷信號(hào)多次調(diào)用中斷處理例程,造成系統(tǒng)死機(jī)的情況[11]。

      圖4 中斷處理流程

      延遲調(diào)用例程的任務(wù):

      1)判斷DMA 傳輸是否完成,通過(guò)調(diào)用函數(shù)WdfDmaTransactionDmaCompleted 實(shí)現(xiàn)。若未完成則應(yīng)繼續(xù)進(jìn)行 DMA 傳輸,若完成則調(diào)用函數(shù)WdfDmaTransactionRelease,結(jié)束當(dāng)前DMA 傳輸。

      2)通知應(yīng)用程序DMA 傳輸結(jié)束并對(duì)傳輸數(shù)據(jù)進(jìn)行處理,通過(guò)事件通知方式實(shí)現(xiàn)。

      3.4 事件通知

      事件是驅(qū)動(dòng)程序喚起應(yīng)用程序進(jìn)行操作的方法[12],驅(qū)動(dòng)程序通過(guò)內(nèi)核事件的方式通知應(yīng)用程序DMA 傳輸結(jié)束。應(yīng)用程序在創(chuàng)建事件句柄后,通過(guò)發(fā)送I/O 請(qǐng)求將事件句柄傳遞給驅(qū)動(dòng)程序。

      驅(qū)動(dòng)程序在PXIeEvtDeviceIoControl 例程中根據(jù)獲得的事件句柄構(gòu)造一個(gè)內(nèi)核事件。之后,應(yīng)用程序便在輔助線程上等待該內(nèi)核事件置位。知并讀取DMA 傳輸數(shù)據(jù)。

      3.5 電源管理

      在設(shè)備電源功耗的控制方面,當(dāng)驅(qū)動(dòng)程序內(nèi)無(wú)任何活動(dòng)的情況下,即設(shè)備處于空閑狀態(tài)時(shí)進(jìn)入低功耗狀態(tài),可達(dá)到降低設(shè)備電源功耗的目的。

      電源管理遵循ACPI 規(guī)范[13?14],因此設(shè)計(jì)在操作系統(tǒng)S0(系統(tǒng)工作狀態(tài))下,當(dāng)設(shè)備處于空閑狀態(tài)達(dá)到規(guī)定時(shí)間后,自動(dòng)由D0 狀態(tài)(設(shè)備工作狀態(tài))進(jìn)入D2 狀態(tài)(設(shè)備休眠狀態(tài))。電源狀態(tài)管理流程如圖5 所示。

      圖5 電源狀態(tài)管理流程

      當(dāng)有新的I/O 請(qǐng)求到達(dá)驅(qū)動(dòng)程序時(shí),喚醒并調(diào)整設(shè)備電源狀態(tài)至D0狀態(tài)。結(jié)構(gòu)體WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 負(fù)責(zé)空閑功能參數(shù)的設(shè)置,PXIeEvtDeviceAdd 例程中代碼設(shè)計(jì)如下:

      4 結(jié) 語(yǔ)

      驅(qū)動(dòng)程序的開(kāi)發(fā)需要掌握操作系統(tǒng)、硬件設(shè)備等方面的知識(shí),需要結(jié)合實(shí)際情況靈活實(shí)現(xiàn)驅(qū)動(dòng)程序功能,從而實(shí)現(xiàn)軟硬件的協(xié)調(diào)工作。本文基于WDF 驅(qū)動(dòng)框架設(shè)計(jì)了PXIe 可重構(gòu)儀器的設(shè)備驅(qū)動(dòng)程序,成功實(shí)現(xiàn)了硬件訪問(wèn)和DMA 傳輸?shù)裙δ?。在?shí)際測(cè)試中將儀器插入PXIe 機(jī)箱中進(jìn)行調(diào)試,驅(qū)動(dòng)程序運(yùn)行穩(wěn)定可靠,成功實(shí)現(xiàn)了控制指令發(fā)送和數(shù)據(jù)傳輸?shù)墓δ堋?/p>

      猜你喜歡
      驅(qū)動(dòng)程序內(nèi)核調(diào)用
      強(qiáng)化『高新』內(nèi)核 打造農(nóng)業(yè)『硅谷』
      核電項(xiàng)目物項(xiàng)調(diào)用管理的應(yīng)用研究
      基于嵌入式Linux內(nèi)核的自恢復(fù)設(shè)計(jì)
      Linux內(nèi)核mmap保護(hù)機(jī)制研究
      LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
      計(jì)算機(jī)硬件設(shè)備驅(qū)動(dòng)程序分析
      基于系統(tǒng)調(diào)用的惡意軟件檢測(cè)技術(shù)研究
      微生物內(nèi)核 生態(tài)型農(nóng)資
      基于MPC8280的CPU單元與內(nèi)部總線驅(qū)動(dòng)程序設(shè)計(jì)
      利用RFC技術(shù)實(shí)現(xiàn)SAP系統(tǒng)接口通信
      泾川县| 隆尧县| 冷水江市| 施秉县| 顺昌县| 文安县| 疏勒县| 会昌县| 冀州市| 芒康县| 翁牛特旗| 山东省| 额敏县| 漠河县| 广宁县| 凤冈县| 丰原市| 凌海市| 宜兴市| 大丰市| 闽清县| 安徽省| 葵青区| 新巴尔虎右旗| 富裕县| 扎赉特旗| 景洪市| 丽江市| 肇州县| 寿阳县| 浪卡子县| 玉龙| 新巴尔虎右旗| 北流市| 贵州省| 尼勒克县| 日照市| 白城市| 荥阳市| 清原| 岳阳市|