LabWindows/CVI儀器驅動程序的開發(fā)
因為沿用了在Pascal語言中調用在DLL程序驅動的習慣,當用戶在Labwin的環(huán)境調用用戶定義函數(shù)時,把宏_VI_FUNC(表示任何用戶函數(shù))翻譯成_pascal,而使用外部編譯器編譯時,則把宏解釋成_far_pascal_export。同樣在Labwin中,_VI_FAR(表示用戶函數(shù)中任何的數(shù)組參數(shù)和輸出變量)被翻譯成空,而用其它編譯程序時,被翻譯成_far。
如下面這個函數(shù):
ViStatus_VI_FUNCtek2430a_read_waveform(ViSessioninstrSession,
ViReal64_VI_FARwvfm[],
ViReal64_VI_FAR*xin,
ViReal64_VI_FAR*trig_off);
在LabWindows/CVI環(huán)境時,表示為:
ViStatus_pascaltek2430a_read_waveform(ViSessioninstrSession,
ViReal64wvfm[],
ViReal64*xin,
ViReal64*trig_off);
而在其它編譯環(huán)境下,表示為:
ViStatus_far_pascal_exporttek2430a_read_waveform(ViSessioninstrSession,
ViReal64_farwvfm[],
ViReal64_far*xin,
ViReal64_far*trig_off);
5在BC3192測試程序中的應用實例
VXI的設備驅動程序包括以下幾個主要功能。首先是分配設備的地址指針,這需要定義動態(tài)鏈接庫的代碼段和數(shù)據(jù)段為可移動和可刪除,因為要用基指針指向每一個I/O動作,所以代碼段和數(shù)據(jù)段是不定的;其次是VXI總線寄存器的寫入和讀取動作,這些操作需要我們使用剛得到的設備地址指針;再次是向緩存中讀取和寫入信息。另外,還有初始化,以及系統(tǒng)固定延遲時間等一系列功能。
在BC3192的測試程序中,結合Labwin自帶的VXI總線的設備驅動程序,編寫了一個簡單的VXI驅動程序。它存于程序的根目錄中,有4個支持文件,分別是vxirw.c、vxirw.dll、vxirw.h以及vxirw.lib。在我們的程序中,由于考慮到工作的效率,決定使用在VisualC++1.5的編譯環(huán)境下,編譯vxirw.c和vxirw.h程序,生成vxirw.dll及vxirw.lib的高效方法。這是由于Labwin使用一種LCC內建解釋器對程序進行解釋,其效率遠不如直接使用動態(tài)鏈接庫方便。用VC編譯器編譯的動態(tài)鏈接文件,可以在Labwin的函數(shù)中方便地進行調用。而且其效率同VC自身的調用不相上下。
如下面代碼所示,正是使用了剛才所表示的函數(shù)調用方法。
voidFARPASCAL__export__loaddsReadReg(UINTLa,UINTOffset,UINTFAR*Data)
/*這是用于讀取總線寄存器的函數(shù)。*/
{
/**Data=(UINT)(*(pPointer+La*32+Offset/2));*/
/*gettheaddresspointer*/
GetPointer(La);/*調用La全局變量取得寄存器地址*
/*readregister*/
*Data=(UINT)(*(pPointer+Offset/2));/*把寄存器中的值通過偏移地址取出*/
/*freetheselector*/
FreeSelector(wSelector);/*釋放在取寄存器的值時所用到的字選擇臨時變量。*/
}
程序的調用要熟悉大量硬件的特性,不屬于軟件總體設計之列,在此不再介紹。
6結論
Labwindows這種以C語言為中心的編程方式有其優(yōu)勢,所帶的C語言的功能比較靈活,而又便于開發(fā)一些大型的工程。它的類庫的功能又可以開放地進行擴充,使系統(tǒng)的功能得到進一步增強。相對地,新型編程方式只能在固定的自帶環(huán)境中運行,而且在表達復雜關系時,流程圖的聯(lián)系方式有很大的局限性。所以,Labwindows的編程方式在一段時間內將仍然擁有其地位。而今后的發(fā)展很可能是把兩種編程方法進行集成,使我們在建立流程圖后可以生成大部分程序代碼,而細微的地方又可以進行C語言的調整。這樣,我們的編程人員將擁有更方便的編程工具。
評論