1 引 言
随着嵌入式技术的发展,数据采集广泛应用于现场设备中。本文根据实际项目需求,开发了数据采集卡在VxWorks操作系统下的驱动程序,以方便应用程序开发。
本文采用的数据采集卡为盛博协同公司基于PC/104总线的ADT700采集卡,他通过总线与PC/104嵌入式系统构成一个高性能的数据采集与控制系统。ADT700具有如下特点:
模拟输入 16单端/8差分输入;12位分辨率;100 kHz最大A/D采样率;0~+10 V,-5~+5 V,-10~+10 V双极性或单极性输入量程;1,2,4,8倍可编程增益;DMA实现数据的高速传输。
模拟输出 4通道输出;-5~+5 V,-10~+10 V,0~5 V,0~10 V量程可选;通道单独置数或4通道同时置数。
数字量I/O 可编程外围接口,24通道TTL/CMOS兼容;I/O接口上拉或下拉限流电阻。
定时/计数器 6个16位、10 MHz(最大)定时/计
2 VxWorks及其字符设备驱动
VxWorks是一个基于抢占式的实时操作系统,他以其高度的可靠性、优秀的实时性、灵活的可裁性广泛应用到许多行业中。在VxWorks中,I/O系统提供了与设备无关的用户接口,应用程序可以通过标准的接口函数如:create(),remove(),open(),close(),read(),write(),ioctl()等来访问设备驱动程序,而不用关心驱动程序是如何实现的。ADT700属于字符型设备,他的驱动程序需要支持以上接口函数。
下面以字符设备中open()操作为例,说明字符设备驱动程序结构。
如图1所示,当应用程序调用fd=open("/xx0",ORDONLY,0)时,I/O系统根据文件名"/xx0"在设备列表中查找设备(设备是以文件形式存在的,文件名即设备名)(如①所示);查找到相应设备后根据驱动号定位到驱动表中(如②所示);I/O系统在文件描述表中预留一个表项fd=3(如③所示);然后I/O系统调用驱动程序中的xxoOpen()函数,返回需要保留的值,即设备描述指针(如④所示);I/O系统将驱动号和驱动返回值填到文件描述符表中(如⑤所示);最后,I/O系统返回新opeh()的文件在文件描述符表中的索引,应用程序得到文件描述符fd=3(如⑥所示)。用户可以通过操作文件来访问I/O设备。
3驱动实现
3.1 功能分类
ADT700具有A/D,D/A转换,数字I/O,定时/计数等功能,对其进行分析,可分为3类:
(1)A/D转换为只读,而D/A转换为只写;
(2)数字I/O既可读又可写;
(3)定时/计数器基本无需读写,只设置即可。
根据以上功能,得出需要实现3个驱动,分别为:
(1)adtDrv驱动,用于读入A/D转换后的数据,写出D/A转换的数据,设备描述符为"/adt";
(2)ppiDrv驱动,用于读入或写出数字I/O的数字,设备描述符为"/ppi";
(3)pitDrv驱动,用于设置定时/计数器,设备描述符为"/pit"。
3.2基本流程
(1)安装驱动
I/O系统的功能是将用户的I/O请求转换成对相应驱动程序具体操作函数的调用,他通过维护一个包括所有驱动程序操作函数的地址表来实现的。通过调用ios-DrvInstall()可以动态安装驱动程序,该函数的参数就是7种基本I/O操作函数指针。iosDrvInstall()函数将这些地址写入驱动表中的一块空闲存储区中,并返回这块存储区的编号,编号即驱动程序号,可被与驱动程序相关联的设备使用。iosDrvInstall()的原型是:
int iosDrvtnstall(FUNCPTR pCreate,FUNCPTRpDelete, FUNCPTR pOpen, FUNCPTR pClose,FUNCPTR pRead,FUNCPTR pWrite,FUNCPTR pI-octl);
当调用iosDrvInstall()注册I/O函数成功后,在shell下用iosDrvShow命令可以观察驱动表中ADT700的驱动入口。
(2)创建设备
创建设备过程即是调用设备创建函数iosDevAdd()将此设备加入到I/O系统的设备列表中。iosDevAdd()的原型为:
STATUS iosDevAdd(DEV_HDR*pDevHdr,char*name,int drvnum);
其中:DEV_HDR是一个指向该设备的描述符指针;而DEV_HDR结构中的第一项则指向下一个设备的描述符指针。
设备创建成功后,在shell下用devs命令可以观察设备列表中ADT700的设备描述符。
以ADT700中adtDrv驱动为例,以上两步的完成过程如图2所示。
(3)实现I/O函数
安装驱动和创建设备完成后,就需要实现I/O函数,即填充驱动表中的函数了。对于字符型设备而言,打开设备操作与创建设备操作通常使用相同的函数,底层驱动中都用xxOpen()完成;而设备驱动一旦安装,就无需删除,remove()无效,因此在底层驱动中xxRemove()为空。下面给出了ppiDrv驱动中ppiRead()的实现模板。
4 结 语
本文以数据采集卡驱动程序为例,详细介绍了Vx-Works操作系统下字符设备驱动程序的开发过程。本驱动程序封装了ADT700几乎所有功能,支持标准的I/O系统接口函数。用户可将ADT700当作文件,只需定义文件名建立文件描述符,而无需关心底层实现,即可完成对他的操作,从而缩短了应用程序开发时间,提高了效率。