基于NI-VISA的PCI板卡驱动程序开发

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于NI-VISA的PCI板卡驱动程序开发

张艳华科

0引言

驱动程序是计算机与设备通讯的特殊程序,操作系统只有通过这个接口,才能控制硬件设备的工作并实时、准确的将信息传递给主机。

PCI总线是PC机广泛采用的外设总线架构,在构建基于PC的信息处理系统中,常常被选择为数据传输通道。传统的PCI设备驱动程序开发平台有WDM、VC、Linux等,但在这种平台上进行驱动程序的开发,需要设计人员熟知操作系统的内核结构,且操作起来比较繁琐,对缺少驱动开发经验者显得比较困难。

本文介绍一种简单、快速的PCI接口驱动程序开发方法。使用NI-VISA的Driver Wizard 向导可以方便的生成具有产生中断功能的驱动程序,在NI Labwindows/CVI环境下,可对中断事件进行检测和处理。

1基于NI-VISA的驱动程序

1.1NI-VISA概述

NI-VISA(Virtual Instrument Software Architecture,以下简称为"VISA")是美国国家仪器NI(National1nstrLlrnent)公司开发的一种用来与各种仪器总线进行通信的高级应用编程接口。VISA总线I/0软件是一个综合软件包,它不受平台、总线和环境的限制,可用来对USB、GPIB、串口、VXI、PXI和以太网系统进行配置、编程和调试。VISA是虚拟仪器系统I/O接口软件,基于自底向上结构模型的VISA创造了一个统一形式的I/O控制函数集,并且对于初学者来说这些函数集是简单易用的。

1.2基于VISA的驱动程序开发架构

“驱动程序”通常是指安装于操作系统上,供应用程序调用以操作硬件设备的一组函数。驱动程序提供面向应用程序的API接口函数,把应用程序对API函数的调用翻译成硬件可以理解的底层寄存器操作。驱动程序封装了具体的硬件操作,软件设计者不需要了解具体的操作细节就可以开发基于硬件的应用程序。

基于VISA的驱动又称为“仪器驱动”,这是由于VISA广泛应用于虚拟仪器的开发。VISA提供了一套标准的VISA API函数集,封装了驱动设计的底层细节,使得基于VISA的驱动运行于操作系统的用户层,它通过调用VISA API函数来实现对硬件的操作。基于VISA的仪器驱动的架构如图1所示。

图1基于VISA的驱动架构

Fig.1Driver architecture based on VISA

从图1中可以看出,基于VISA的板卡驱动运行在用户模式,通过VISA提供的API函数功能,用户可方便的实现基于VISA规范的应用层驱动程序开发。

1.3VISA的内部结构

VISA的结构模型如图2所示。

图1VISA的结构模型

Fig.1Structure model of VISA

位于模型最底层的是资源管理器,它负责管理与控制不同种类的仪器并对其进行标准化处理;I/O资源层负责对仪器实现各种具体的读写等操作;仪器资源层负责将I/O资源层中的各种操作按仪器类型进行分类;用户资源层则是用户利用VISA资源而实现的应用程序。位于金字塔结构模型的上层程序可以调用位于其层次下直到最底层程序的所有功能;最顶端是虚拟仪器应用程序,它拥有VISA标准的开放性、兼容性和可移植性,并可直接调用VISA函数。

VISA采用这种金字塔型的结构模型,为各种虚拟仪器系统软件提供了一个形式统一的I/O 操作函数库,以此将不同厂商的仪器软件统一于同一平台。

1.4INF文件创建

使用NI-VISA Driver Wizard向导创建并配置PCI卡的INF文件,开发者只需要按照提示填入对应的参数,如设备ID、厂商ID等。如果所设计的PCI使用了中断,则要在向导开始时勾选产生设备中断一项,后续还需进行中断检测和中断移除的配置。向导开始时的配置信息如图3所示。

图3PCI驱动板卡的信息配置

Fig.3Configuration information of PCI drive card

中断的检测与移除过程如图4所示。

图4中断的检测与移除过程

Fig.4Process of detecting or removing an interrupt

2PCI板卡与VISA间的通讯实现

2.1PCI板卡与VISA建立会话

(1)查询与指定的PCI板卡接口连接

通过status=viFindRsrc(defaultRM,"PXI?*INSTR",&fList,iNum,strRsrc)找到指定的PCI板卡。

(2)打开PCI设备

通过status=viOpen(defaultRM,rsrcName,VI_NULL,VI_NULL,vi)与PCI设备建立会话。

2.2基本的I/O函数

通过viIn()和viOut()函数对寄存器进行读写访问。还可以通过例如viMapAddress、

viPeek8/viPeek16/viPeek32、viMoveOut8/viMoveOut16/viMoveOut32等函数实现其他形式的读写访问。

2.3VISA中断事件处理分析

VISA处理一个来自设备的中断使用事件处理模式。处理事件有两种机制,即排队机制和函数回调机制。两种执行机制都可以根据需要被挂起,程序执行过程中随时都可以调用ViDisableEvent()来挂起或终止事件的接受。当用ViEnableEvent()重新定义VIHNDLR时,系统立即触发回调函数处理队列中被挂起的所有事件。

2.3.1排队法

所有发生的指定的事件被放置在一个队列中。程序会定期询问队列获取事件的信息或暂停程序直到放置在队列里的某一事件发生。排队机制一般对不重要的或不需要立即引起注意的事件有用。使用排队处理机制,程序开发者必须手动调查队列中的事件,以确定哪些事件的发生。使用函数viWaitOnEvent()可以完成此功能。viWaitOnEvent()函数使程序暂停,等待指定的事件发生。当指定的事件发生时,有关该事件的具体信息便通过此函数传递回来。

2.3.2回调函数法

回调函数法是在一个特定事件发生时,由VISA驱动程序自动调用代码段。回调机制适用于需要立即响应的应用请求,一个应用请求可以同时使用队列和回调。采用回调函数法,在使用viEnableEvent()使能事件之前,必须将一个中断处理和一个特定的事件相关联。将中断处理和事件关联的函数是viInstallHandle(),调用此函数,然后使能事件。当中断发生时,使用viInstallHandle()指定的功能被异步调用。

回调函数处理事件的代码例程如下:

status=viInstallHandler(vi,VI_EVENT_PXI_INTR,Mic0ReadPimStatusCallback,PimStatusBuffer);

//安装回调函数句柄将事件VI_EVENT_PXI_INTR与回调函数Mic0ReadPimStatusCallback关联,数据存放在PimStatusBuffer,PimStatusBuffer为临时申请的空间

status=viEnableEvent(vi,VI_EVENT_PXI_INTR,VI_HNDLR,VI_NULL);//使能检测事件类型,采用的处理机制为VI_HNDLR

if(status!=VI_SUCCESS)

{

free(PimStatusBuffer);

return-1;

}

PimStatus=*PimStatusBuffer;//获取缓冲区地址内的数据

free(PimStatusBuffer);//释放申请的缓冲区

//使句柄失效并卸载

status=viDisableEvent(vi,VI_EVENT_PXI_INTR,VI_HNDLR);//关闭中断

status=viUninstallHandler(vi,VI_EVENT_PXI_INTR,Mic0ReadPimStatusCallback,PimStatusBuffer);

3结论

本文给出了利用NI-VISA的Driver Wizard工具进行快速开发PCI设备驱动程序的设计过程,对VISA的事件处理机制进行了详细分析。利用函数回调的方法实现PCI中断的事件处理,使得中断事件可以得到及时快速的响应。

相关文档
最新文档