張 艷 高一棟
(西安電子工程研究所 西安 710100)
在某信號(hào)處理系統(tǒng)應(yīng)用中,需要數(shù)據(jù)板與計(jì)算機(jī)之間建立硬件傳輸通道,將處理輸出的數(shù)據(jù)實(shí)時(shí)地傳輸?shù)接?jì)算機(jī)中,以便于進(jìn)行顯示、存儲(chǔ)及做其他的后續(xù)處理。同時(shí),計(jì)算機(jī)使用的Windows操作系統(tǒng),應(yīng)用程序工作在“用戶模式”下,需要設(shè)計(jì)人員編寫設(shè)備驅(qū)動(dòng)程序?qū)崿F(xiàn)對(duì)硬件設(shè)備的訪問(wèn)。
圖1 WinDriver體系結(jié)構(gòu)圖
目前,開(kāi)發(fā)Windows環(huán)境下常用的設(shè)備驅(qū)動(dòng)程序的工具主要有DDK(Device Driver Kit)和Win-Driver。DDK是Microsoft公司的設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)軟件,使用DDK開(kāi)發(fā)驅(qū)動(dòng)程序,必須精通Windows內(nèi)部體系結(jié)構(gòu)、MicrosoftMASM匯編語(yǔ)言和設(shè)備驅(qū)動(dòng)程序結(jié)構(gòu)體系方法,以及具備豐富的內(nèi)核模式程序開(kāi)發(fā)經(jīng)驗(yàn),否則可能造成軟件的不穩(wěn)定,甚至系統(tǒng)的崩潰。而美國(guó)Jungo公司推出的WinDriver驅(qū)動(dòng)程序工具包,把底層操作都封裝在一個(gè)內(nèi)核模塊中,提供給用戶標(biāo)準(zhǔn)的WinDriver API函數(shù)來(lái)實(shí)現(xiàn)硬件訪問(wèn),可使編程人員用C或C++語(yǔ)言在用戶模式下編寫驅(qū)動(dòng)程序,不涉及操作系統(tǒng)底層編程且具有很好的兼容性,在短期內(nèi)就可開(kāi)發(fā)出實(shí)現(xiàn)基本功能又具有較高執(zhí)行效率的驅(qū)動(dòng)程序。圖1所示為Win-Driver體系結(jié)構(gòu)圖。
以使用的WinDriver v6.02版為例,它支持目前通用的 Windows98/Me/NT/2000/XP/CE/CE.NET/Server2003,Linux,Solaris和VxWorks等操作系統(tǒng),而且利用WinDriver產(chǎn)生的驅(qū)動(dòng)程序和應(yīng)用程序源代碼在這些操作系統(tǒng)中都是互相兼容的[1]。同時(shí)它支持PCI/CardBus/ISA/ISAPnP/EISA/Com-pactPCI和USB等多種總線結(jié)構(gòu)。
下面,介紹利用WinDriver的用戶模式在DriverWizard向?qū)У囊龑?dǎo)下按步驟完成驅(qū)動(dòng)代碼的生成。
A.選擇硬件,產(chǎn)生.INF文件。
PCI(Peripheral Component Interconnect)總線具有即插即用的特點(diǎn),在Driver Wizard將會(huì)顯示所有的即插即用(Plug-and-Play)設(shè)備列表,從中選擇對(duì)應(yīng)的硬件,產(chǎn)生.INF安裝文件,然后添加此新硬件。
B.配置、診斷硬件。
Driver Wizard將自動(dòng)測(cè)試硬件設(shè)備資源,包括I/O地址范圍、內(nèi)存范圍,寄存器以及中斷。根據(jù)需要進(jìn)行手動(dòng)添加、設(shè)置。
定義完P(guān)CI總線硬件設(shè)備資源后,在寫驅(qū)動(dòng)程序之前,還需要使用Driver Wizard簡(jiǎn)單診斷硬件是否工作正常,如:用“read”和“write”來(lái)讀寫硬件的內(nèi)存及寄存器。用“l(fā)isten”來(lái)監(jiān)聽(tīng)硬件中斷。
C.生成硬件驅(qū)動(dòng)樣本。
在硬件診斷正確后,選擇特定的開(kāi)發(fā)環(huán)境或編程語(yǔ)言(我們選擇的C++Builder),讓W(xué)inDriver生成一個(gè)相應(yīng)開(kāi)發(fā)環(huán)境的設(shè)備驅(qū)動(dòng)樣本(設(shè)置的工程名字是:mypic)。生成的驅(qū)動(dòng)樣本代碼主要包括:a.各種工程文件,在C++Builder 6.0中其文件為mypic.bpr,mypic.cpp 等;b.設(shè)備的應(yīng)用級(jí) API函數(shù)文件:mypic-lib.c;c.利用上述API函數(shù)訪問(wèn)硬件的樣本程序文件:mypic-diag.c;
用戶可以直接利用驅(qū)動(dòng)樣本中的標(biāo)準(zhǔn)WinDriver API函數(shù)來(lái)實(shí)現(xiàn)對(duì)硬件的操作和訪問(wèn)。
將WinDriver API函數(shù)移植到用戶應(yīng)用程序中的方法是,在C++Builder6.0中新建一個(gè)工程,將頭文件mypic-lib.h包含進(jìn)源代碼中。然后根據(jù)實(shí)際需要,選擇mypic-lib.c需要用到的硬件操作API函數(shù),將它們拷貝到新建工程的函數(shù)定義部分。最后用戶在工程中加入完成設(shè)備具體任務(wù)的功能代碼,在代碼中調(diào)用拷貝的API函數(shù)進(jìn)行硬件操作,便完成了用戶級(jí)驅(qū)動(dòng)的開(kāi)發(fā)。以下是程序片段:
如上述,已經(jīng)成功完成信號(hào)處理數(shù)據(jù)板和計(jì)算機(jī)之間CPI總線數(shù)據(jù)的傳輸,每次中斷循環(huán)讀取1024點(diǎn)數(shù)據(jù)。
下面完成應(yīng)用程序的顯控程序部分。摘選程序片段如下:
信號(hào)處理數(shù)據(jù)板向計(jì)算機(jī)發(fā)送某雷達(dá)SAR圖像數(shù)據(jù),此實(shí)時(shí)數(shù)據(jù)采集程序運(yùn)行中的界面截圖如圖2所示。
圖2 實(shí)時(shí)數(shù)據(jù)采集程序運(yùn)行中顯示界面圖
本文采用WinDriver和C++Builder兩種開(kāi)發(fā)工具,實(shí)現(xiàn)了對(duì)PCI總線高速數(shù)據(jù)采集程序的設(shè)計(jì)。在實(shí)際應(yīng)用中,系統(tǒng)運(yùn)行穩(wěn)定,完成實(shí)時(shí)數(shù)據(jù)傳輸、顯示、存儲(chǔ)。同時(shí)可以看出,利用WinDriver軟件工具包在Windows操作系統(tǒng)下開(kāi)發(fā)設(shè)備驅(qū)動(dòng)程序是一種高效、可靠的方式,值得大多數(shù)非專業(yè)驅(qū)動(dòng)程序的研發(fā)人員使用。
[1]WinDriver v6.02 User's Guide[M].Jungo Ltd,20thMay 2003.
[2]PCI LocalBus Specification[M].Revision 2.2 De-cember18,1998.
[3]李幼儀,甘志.C++Builder高級(jí)應(yīng)用開(kāi)發(fā)指南[M].清華大學(xué)出版社,2002.
[4]簡(jiǎn)育華.基于WinDriver的Windows驅(qū)動(dòng)程序開(kāi)發(fā)[J].火控雷達(dá)技術(shù),2011,40(1):68-70.