微波EDA网,见证研发工程师的成长!
首页 > 测试测量 > 测试测量技术文库 > LabWindows/CVI仪器驱动程序的开发

LabWindows/CVI仪器驱动程序的开发

时间:03-09 来源:嵌入式在线 点击:

名称

定义

ViInt16

Signed16bitinteger(16位整数)

ViInt32

Signed32bitinteger(32位整数)

ViReal64

64bitfloatingpointnumber(64位浮点小数)

ViInt16[]

AnarrayofViInt16values(由16位整数组成的数组)

ViInt32[]

AnarrayofViInt32values(由32位整数组成的数组)

ViReal64[]

AnarrayofViReal64values(由64位整数组成的数组)

ViChar[]

Astring(一个字符串)

ViRsrc

AVISAresourcedescriptor(也是字符串)

ViSession

AVISAsessionhandle(一个会话的句柄)

ViStatus

AVISAreturnstatustype(返回状态值的类型)

ViBoolean

Booleanvalue(布尔型数)

ViBoolean[]

AnarrayofViBooleanvalues(布尔型数组)

4.5函数定义的方法

  驱动程序函数调用的返回值也与众不同,VISA/IO(Labwin中的虚拟设备接口)定义了一种非常有用的调用设备函数时使用的宏,如表2所示。

表2函数的定义

 

LabWindows/CVIEnvironment

OutsidetheCVI

Macro

(Windows)

Environment(Windows)UNIX

_VI_FUNC

_pascal

_far_pascal_export

_VI_FAR

 

_far

  因为沿用了在Pascal语言中调用在DLL程序驱动的习惯,当用户在Labwin的环境调用用户定义函数时,把宏_VI_FUNC(表示任何用户函数)翻译成_pascal,而使用外部编译器编译时,则把宏解释成_far_pascal_export。同样在Labwin中,_VI_FAR(表示用户函数中任何的数组参数和输出变量)被翻译成空,而用其它编译程序时,被翻译成_far。
如下面这个函数 :

ViStatus _VI_FUNC tek2430a_read_waveform (ViSession instrSession,
ViReal64 _VI_FAR wvfm[],
ViReal64 _VI_FAR * xin,
ViReal64 _VI_FAR * trig_off);
  在 LabWindows/CVI环境时,表示为:
ViStatus _pascal tek2430a_read_waveform (ViSession instrSession,
ViReal64 wvfm[],
ViReal64 * xin,
ViReal64 * trig_off);
  而在其它编译环境下,表示为:
ViStatus _far _pascal _export tek2430a_read_waveform (ViSession instrSession,
ViReal64 _far wvfm[],
ViReal64 _far * xin,
ViReal64 _far * trig_off);

5在BC3192测试程序中的应用实例

  VXI的设备驱动程序包括以下几个主要功能。首先是分配设备的地址指针,这需要定义动态链接库的代码段和数据段为可移动和可删除,因为要用基指针指向每一个I/O动作,所以代码段和数据段是不定的;其次是VXI总线寄存器的写入和读取动作,这些操作需要我们使用刚得到的设备地址指针;再次是向缓存中读取和写入信息。另外,还有初始化,以及系统固定延迟时间等一系列功能。

  在BC3192的测试程序中,结合Labwin自带的VXI总线的设备驱动程序,编写了一个简单的VXI驱动程序。它存于程序的根目录中,有4个支持文件,分别是vxirw.c、vxirw.dll、vxirw.h以及vxirw.lib。在我们的程序中,由于考虑到工作的效率,决定使用在VisualC++1.5的编译环境下,编译vxirw.c和vxirw.h程序,生成vxirw.dll及vxirw.lib的高效方法。这是由于Labwin使用一种LCC内建解释器对程序进行解释,其效率远不如直接使用动态链接库方便。用VC编译器编译的动态链接文件,可以在Labwin的函数中方便地进行调用。而且其效率同VC自身的调用不相上下。

如下面代码所示,正是使用了刚才所表示的函数调用方法。
void FAR PASCAL __export __loadds ReadReg(UINT La, UINT Offset, UINT FAR * Data)
/* 这 是 用 于 读 取 总 线 寄 存 器 的 函 数 。 * /
{
/* * Data=(UINT)(* (pPointer+ La* 32+ Offset/2)); * /
/* get the address pointer * /
GetPointer(La); /* 调用La全局变量取得寄存器地址*
/* read register * /
* Data=(UINT)(* (pPointer+ Offset/2)); /*把寄存器中的值通过偏移地址取出* /
/* free the selector * /
FreeSelector(wSelector);/*释放在取寄存器的值时所用到的字选择临时变量。 * /
}
程序的调用要熟悉大量硬件的特性,不属于软件总体设计之列,在此不再介绍。
6结论

  Labwindows这种以C语言为中心的编程方式有其优势,所带的C语言的功能比较灵活,而又便于开发一些大型的工程。它的类库的功能又可以开放地进行扩充,使系统的功能得到进一步增强。相对地,新型编程方式只能在固定的自带环境中运行,而且在表达复杂关系时,流程图的联系方式有很大的局限性。所以,Labwindows的编程方式在一段时间内将仍然拥有其地位。而今后的发展很可能是把两种编程方法进行集成,使我们在建立流程图后可以生成大部分程序代码,而细微的地方又可以进行C语言的调整。这样,我们的编程人员将拥有更方便的编程工具。

参考文献

[1]NI Corporation.Labwindows/CVI Interface Reference Guide[Z],1994.
[2]NI Corporation.Labwindows/CVI Programing Guide.[Z],1994.
[3]NI Corporation.Labwindows/CVI Function Library Guide.[Z], 1994.
[4]陈 光.VXI总线测试平台技术[M].成都电子科技大学出版社,1995.

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top