基于PCI總線(xiàn)模塊的多通道串行數據采集系統設計
3 系統軟件開(kāi)發(fā)
3.1 驅動(dòng)程序
PCI設備的硬件資源由Windows操作系統根據PC機中所有設備對資源的占有來(lái)統一分配。為了保證系統的安全和穩定性,在Windows2000及其后的微軟操作系統中,運行在ring3層的用戶(hù)應用程序無(wú)法直接訪(fǎng)問(wèn)硬件,而必須通過(guò)運行于ring0層的設備驅動(dòng)程序來(lái)訪(fǎng)問(wèn)。設備驅動(dòng)不僅要實(shí)現對硬件的操作,還要為用戶(hù)應用程序提供專(zhuān)用的API函數庫,以方便用戶(hù)實(shí)現對硬件的操作訪(fǎng)問(wèn)。
Windows XP操作系統下的驅動(dòng)程序一般是基于WDM(Windows Driver Model)模型開(kāi)發(fā)的。該模型中的上層應用程序通過(guò)調用Win32 API函數發(fā)出對設備的訪(fǎng)問(wèn)請求,I/O管理器則根據這個(gè)請求構造合適的IRP(I/O Request Packet,I/O請求包),并將其傳給設備驅動(dòng)程序,接著(zhù)由驅動(dòng)程序直接訪(fǎng)問(wèn)硬件完成IRP處理,最后由I/O管理器把數據和結構返回給應用程序。
WDM驅動(dòng)比較常用的有以下三種方法:
第一種是直接使用Windows DDK(Device
Driver Kit,驅動(dòng)程序開(kāi)發(fā)包)開(kāi)發(fā)的驅動(dòng)程序面向Windows內核,該方法工作穩定,效率更高。但必須精通Windows內部體系結構及設備驅動(dòng)程序的體系結構等,因此開(kāi)發(fā)難度較大。
第二種是使用DriverStudio。此工具軟件已經(jīng)做了很多基礎性工作,也進(jìn)行了一些封裝。
第三種是使用WinDriver,使用該方法時(shí),開(kāi)發(fā)者只需要在用戶(hù)模式下編寫(xiě)程序來(lái)調用它提供的通用驅動(dòng)即可。其中Drvier Wizard可以進(jìn)行硬件診斷和自動(dòng)代碼生成。另外還可以將對速度要求較高的模塊插入內核運行來(lái)獲取更好的性能。本系統即采用WinDriver開(kāi)發(fā)方法。
3.2 WinDriver中的重要函數
利用WinDriver開(kāi)發(fā)驅動(dòng)程序通常有兩種方法:第一種是利用Driver Wizard生成的代碼進(jìn)行修改;第二種是直接利用WinDriver提供的API函數來(lái)編寫(xiě)自己的程序。本系統即采用這種方法,開(kāi)發(fā)時(shí)首先要注意包含所有相關(guān)的頭文件。其基本驅動(dòng)程序的結構及API函數如下:

3.3 中斷實(shí)現
PCI總線(xiàn)的通信方式有查詢(xún)和中斷兩種方式。查詢(xún)方式實(shí)現簡(jiǎn)單,但是難以適應實(shí)時(shí)性要求較高的場(chǎng)合,而且上位機軟件資源占用率過(guò)大;中斷方式則可克服以上缺點(diǎn),可以實(shí)現數據的實(shí)時(shí)傳輸。本系統將數據經(jīng)過(guò)處理后存入RAM,存滿(mǎn)一幀數據,硬件便發(fā)出中斷請求信號,上位機響應中斷請求后,即可讀取一幀數據。
要實(shí)現中斷機制,就要建立一個(gè)獨立的中斷響應線(xiàn)程,并在主函數中完成中斷的使能、屏蔽及中斷線(xiàn)程的啟動(dòng)。另外,使用WinDriver處理電平中斷時(shí),還必須建立傳輸命令(INTCSR)來(lái)應答中斷。
其中斷處理過(guò)程分為四步:
第一步,調用WDC_IntEnable(),此函數的功能是分配并初始化WC_INTERRUPT結構體,自動(dòng)創(chuàng )建中斷處理線(xiàn)程,同時(shí)在其中包含WD_Int-Wait()函數,作用是使線(xiàn)程休眠直至有中斷發(fā)生。另外,還可以調用底層API函數InterruptEnable()或WD_Enable(),但此時(shí)需要由用戶(hù)自己創(chuàng )建中斷線(xiàn)程;
第二步是中斷線(xiàn)程無(wú)限循環(huán)以等待中斷發(fā)生。中斷發(fā)生時(shí),WinDriver在內核中執行傳輸命令,當操作返回到用戶(hù)模式時(shí),驅動(dòng)的用戶(hù)模式中斷處理例程將被調用;之后,中斷處理例程返回,但中斷等待循環(huán)繼續;最后在不再使用中斷時(shí),調用’WDC_IntDisable()、底層API函數Inter-mptDisable()或WD_IntDisable()來(lái)關(guān)閉中斷。
3.4 驅動(dòng)的分發(fā)及安裝
驅動(dòng)的分發(fā)是指在目標機上不用安裝WinDriver開(kāi)發(fā)包即可應用其開(kāi)發(fā)的設備驅動(dòng)。需要準備的分發(fā)包應包括windrvr6.sys、windrvr-6.inf、wd921.cat、waapi921.dll、difxapi.dll、自己的INF(Information File)等文件,而且即使是自己開(kāi)發(fā)內核驅動(dòng)。也應包含在內。
Windows操作系統依靠INF文件來(lái)得到即插即用設備的驅動(dòng)程序信息。WinDriver會(huì )自動(dòng)檢測PC機上的即插即用設備。并為相應硬件生成I-NF文件,而且只需稍作修改即可。INF文件可引導系統找到硬件所需要的驅動(dòng)程序,由WinDriver生成的INF文件中列出了默認的拷貝文件win-drvr6.sys。設備驅動(dòng)可通過(guò)工作于內核模式的windrvr6.sys訪(fǎng)問(wèn)硬件。之后在目標機上裝入驅動(dòng)分發(fā)包及INF文件,即可通過(guò)應用程序控制PCI設備。
4 結束語(yǔ)
該數據傳輸系統的PCI接口邏輯和數據傳輸、處理、緩存等用戶(hù)邏輯可集成于一片FPGA中。因而可極大的提高資源利用率,并可滿(mǎn)足大量數據高速傳輸的要求。上位機應用程序采用中斷方式讀取數據可大大提高系統的性能。目前,經(jīng)多次試驗,該系統已完全可以滿(mǎn)足工程需要。
評論