当前位置:首页 > 嵌入式 > 嵌入式软件
[导读]VxWorks下数据采集卡驱动程序开发

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()的实现模板。

完成以上3步,就基本实现了驱动程序,此时,在应用程序中可以用标准接口函数进行操作了。以打开ADT700中定时/计数器(驱动为pitDrv)为例。

此时,在shell用iosFdShow命令可以观察到新创建的文件描述符"/pit/timer"。

4 结 语

本文以数据采集卡驱动程序为例,详细介绍了Vx-Works操作系统下字符设备驱动程序的开发过程。本驱动程序封装了ADT700几乎所有功能,支持标准的I/O系统接口函数。用户可将ADT700当作文件,只需定义文件名建立文件描述符,而无需关心底层实现,即可完成对他的操作,从而缩短了应用程序开发时间,提高了效率。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

摘 要:从硬件与软件方面介绍了基于PXI技术的1553B总线通讯模块的设计,并对PXI总线接口设计、驱动程序的开发、 SDRAM存储器的控制和1553B总线通信协议实现等关键技术进行了详细的阐述,为航空领域测控系统开发P...

关键字: PXI技术 驱动程序 SDRAM存储器 1553B总线

PnP全称Plug-and-Play,译文为即插即用。PnP的作用是自动配置低层计算机中的板卡和其他设备,然后告诉对应设备都做了什么。PnP的任务是把物理设备和软件设备驱动程序相配合,并操作设备,在每个设备和它的驱动程序...

关键字: PnP 驱动程序 操作设备

作 者:道哥,10年嵌入式开发老兵,专注于:C/C、嵌入式、Linux。关注下方公众号,回复【书籍】,获取Linux、嵌入式领域经典书籍;回复【PDF】,获取所有原创文章(PDF格式)。目录kill命令和信号使用kill...

关键字: 信号 应用程序 驱动程序

驱动程序本质上是软件代码,主要作用是计算机系统与硬件设备之间完成数据传送的功能,只有借助驱动程序,两者才能通信并完成特定的功能。

关键字: 驱动程序 硬件设备 UNIX

驱动程序(Device Driver)全称为“设备驱动程序”,是一种可以使计算机和设备通信的特殊程序,可以说相当于硬件的接口,操作系统只能通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常...

关键字: 驱动程序 声卡 设备

作 者:道哥,10年嵌入式开发老兵,专注于:C/C、嵌入式、Linux。关注下方公众号,回复【书籍】,获取Linux、嵌入式领域经典书籍;回复【PDF】,获取所有原创文章(PDF格式)。目录API函数编写驱动程序编写应用...

关键字: 编写 驱动程序 字符设备驱动

作 者:道哥,10年嵌入式开发老兵,专注于:C/C、嵌入式、Linux。关注下方公众号,回复【书籍】,获取Linux、嵌入式领域经典书籍;回复【PDF】,获取所有原创文章(PDF格式)。目录示例程序目标编写驱动程序编写应...

关键字: GPIO 编写 驱动程序

打印机 在我们的办公区域实用性是非常强的,不仅可以提高办公的效率,而且还能节省用户时间,是一款非常不错的办公小助手。长时间使用, 打印机驱动程序无法使用 ,怎么回事呢?用户一定要做出详细了解,是否需要重新安装,下面我们一...

关键字: 驱动程序 打印机驱动

作 者:道哥,10年嵌入式开发老兵,专注于:C/C、嵌入式、Linux。关注下方公众号,回复【书籍】,获取Linux、嵌入式领域经典书籍;回复【PDF】,获取所有原创文章(PDF格式)。目录混乱的API函数旧的API函数...

关键字: 驱动程序 字符设备驱动

作 者:道哥,10年嵌入式开发老兵,专注于:C/C、嵌入式、Linux。关注下方公众号,回复【书籍】,获取Linux、嵌入式领域经典书籍;回复【PDF】,获取所有原创文章(PDF格式)。目录学习的困惑实践环境编译进内核编...

关键字: 内核 编译 驱动程序

嵌入式软件

15715 篇文章

关注

发布文章

编辑精选

技术子站

关闭