基于ISP1581的USB數(shù)據(jù)采集系統(tǒng)的實(shí)現(xiàn)
2.2 驅(qū)動(dòng)程序開發(fā)
Windows環(huán)境下驅(qū)動(dòng)程序有3種模型:VxD模型、KMD模型、WDM模型。WDM模型是微軟力推的全新驅(qū)動(dòng)程序模型,現(xiàn)在主流的操作系統(tǒng)都是采用基于WDM模型的驅(qū)動(dòng)程序,因此本采集系統(tǒng)也采用WDM驅(qū)動(dòng)程序模型來開發(fā)USB設(shè)備的驅(qū)動(dòng)程序。
對(duì)于USB設(shè)備,其WDM驅(qū)動(dòng)程序分為USB底層(總線)驅(qū)動(dòng)程序和USB功能(設(shè)備)驅(qū)動(dòng)程序。USB底層驅(qū)動(dòng)程序由操作系統(tǒng)提供,負(fù)責(zé)與實(shí)際的硬件打交道,實(shí)現(xiàn)底層通信。USB功能驅(qū)動(dòng)程序由設(shè)備開發(fā)者編寫,不對(duì)實(shí)際的硬件進(jìn)行操作,而是通過向USB底層驅(qū)動(dòng)程序發(fā)送包含請(qǐng)求塊URB(USB Request Block)的IRP,以實(shí)現(xiàn)對(duì)USB設(shè)備信息的發(fā)送和接收。
目前,WDM驅(qū)動(dòng)程序開發(fā)工具有3種:Microsoft公司的DDK、Numega公司的DriverStudio和Jungo公司的WinDriver。其中,DDK的開發(fā)難度較大,開發(fā)者需要對(duì)整個(gè)體系結(jié)構(gòu)和WDM規(guī)范有很好的理解和把握,還要熟悉上千個(gè)DDK函數(shù)的功能和使用場(chǎng)合,且測(cè)試流程繁瑣;DriverStudio的開發(fā)難度低一些,它將DDK函數(shù)按照邏輯功能進(jìn)行組織,把很多常用功能封裝成類,建立了一個(gè)基于C++語言的面向?qū)ο蟮木幊汰h(huán)境,開發(fā)者面對(duì)的不再是上千個(gè)復(fù)雜凌亂的DDK函數(shù),而是邏輯清晰的類庫;WinDriver的開發(fā)幾乎沒有難度,開發(fā)者所編寫的只是定制和調(diào)用它提供的通用驅(qū)動(dòng),開發(fā)周期較短,特別適合于驅(qū)動(dòng)程序初學(xué)者使用。
利用WinDriver開發(fā)設(shè)備驅(qū)動(dòng)程序,有2種方法:(1)用Wizard自動(dòng)生成驅(qū)動(dòng)程序的框架代碼,根據(jù)實(shí)際要求修改代碼,加入定制的功能,再在用戶態(tài)執(zhí)行和調(diào)試代碼,并將性能要求苛刻的部分插入到核心態(tài),從而完成整個(gè)驅(qū)動(dòng)程序的編寫。在使用這種方法時(shí),WinDriver已經(jīng)完成了驅(qū)動(dòng)程序編寫的大部分工作,減少了工作量,使編寫驅(qū)動(dòng)成為相對(duì)較簡單。但此方法生成的設(shè)備驅(qū)動(dòng)程序,其通用性和可移植性較差;(2)完全用WinDriver提供的API函數(shù)來寫驅(qū)動(dòng)程序。這樣要比修改由Wizard生成的框架代碼靈活得多,并且編寫的程序更簡短。但這要求開發(fā)者熟悉驅(qū)動(dòng)程序的框架,能熟練運(yùn)用WinDriver API函數(shù)。
為了縮短開發(fā)周期,在實(shí)際應(yīng)用中選用了第1種方法生成驅(qū)動(dòng)程序。具體步驟如下:
(1) 啟動(dòng)Driver Wizard,檢測(cè)連接的USB設(shè)備,生成inf文件,這個(gè)inf文件和WinDriver包含的windrvr6.sys一起,就是新開發(fā)USB設(shè)備的驅(qū)動(dòng)程序。
(2) 點(diǎn)擊Next按鈕,進(jìn)入資源列表窗口,窗口中顯示了管道(Pipe)的一些基本信息。此窗口還可以用于對(duì)外設(shè)進(jìn)行讀寫,測(cè)試硬件資源的正確性,窗口中的Log部分即為測(cè)試結(jié)果。
(3) 點(diǎn)擊Next按鈕,進(jìn)入代碼生成窗口,在窗口中選擇生成C語言代碼。之后Driver Wizard將自動(dòng)生成針對(duì)ISP1581的樣本程序和工程文件(包括代碼文件、說明文件以及適用于VC++編譯器的項(xiàng)目文件)。
(4)重新安裝這個(gè)USB設(shè)備的驅(qū)動(dòng)程序,利用DriverWizard生成的文件,就可開發(fā)應(yīng)用程序了。
經(jīng)過反復(fù)測(cè)試發(fā)現(xiàn),在現(xiàn)有硬件上批量傳輸?shù)乃俣仍?0 Mb/s左右,可以滿足當(dāng)前系統(tǒng)采樣頻率為500 kHz時(shí)的數(shù)據(jù)采集要求,即500K×4路×16=32 Mb/s。但與USB2.0規(guī)范的極限速度相比,現(xiàn)有的批量傳輸速度還不及其13%,分析其原因:
(1) USB2.0規(guī)范定義的最大速度為480 Mb/s,但它是包含令牌包在內(nèi)的傳輸,因此,若扣除通信協(xié)議中的令牌,實(shí)際傳輸速度要遠(yuǎn)低于480 Mb/s。
(2) 從訪問寄存器的時(shí)序參數(shù)可以看出,讀/寫周期最小為80 ns,即DSP對(duì)ISP1581讀寫的最高頻率是12.5 MHz,由于每次讀寫操作的數(shù)據(jù)為2 B,所以DSP與接口芯片之間數(shù)據(jù)傳輸?shù)淖罡咚俾适?5 MB/s,最后的實(shí)際值應(yīng)該小于此值。
(3) 利用WinDriver開發(fā)驅(qū)動(dòng),事實(shí)上它只是定制和調(diào)用WinDriver提供的通用驅(qū)動(dòng)而已,所以并非有針對(duì)性地對(duì)特定硬件編程,程序執(zhí)行效率上也不免大打折扣。
(4) 計(jì)算機(jī)與USB設(shè)備的通信中還包含對(duì)計(jì)算機(jī)硬盤的寫操作,使用測(cè)試軟件對(duì)所用機(jī)器硬盤進(jìn)行寫測(cè)試,測(cè)得平均速度在22~25 MB/s之間,因此硬盤的寫速度也是影響USB數(shù)據(jù)傳輸速度的原因之一。
因此若想在現(xiàn)有硬件平臺(tái)上獲得更高的速度可以在以下幾個(gè)方面進(jìn)行:采用端點(diǎn)的雙緩沖模式、采用ISP1581的DMA模式、采用效率更高的驅(qū)動(dòng)開發(fā)方式及優(yōu)化固件程序以提高硬件的工作效率等。
參考文獻(xiàn):
[1].PCIdatasheethttp://www.dzsc.com/datasheet/PCI_1201469.html.
[2].ISP1581datasheethttp://www.dzsc.com/datasheet/ISP1581_410269.html.
[3].AD7655datasheethttp://www.dzsc.com/datasheet/AD7655_1131512.html.
評(píng)論