APP下载

基于VxWorks的环形缓冲机制的驱动设计

2018-01-08唐小贝杜小雪隋江波

电子设计工程 2017年16期
关键词:服务程序驱动程序缓冲区

唐小贝,杜小雪,隋江波

(1.海军军训器材研究所 北京 102308;2.北海舰队装备部 山东 青岛 266011;3.海军航空工程学院 指挥系,山东 烟台 264001)

基于VxWorks的环形缓冲机制的驱动设计

唐小贝1,杜小雪2,隋江波3

(1.海军军训器材研究所 北京 102308;2.北海舰队装备部 山东 青岛 266011;3.海军航空工程学院 指挥系,山东 烟台 264001)

针对军用PDA硬件自定义设备在VxWorks嵌入式操作系统中的标准化驱动程序开发需求,分析了VxWorks嵌入式操作系统的驱动程序功能设计,以多串口通信驱动为例,结合看门狗定时器和中断处理机制,采用VxWorks系统自身提供的环形缓冲区管理接口库函数,设计了一种更为可靠高效、性能稳定的字符设备底层驱动程序,减少了通信的丢包率,提高了效率。对所有基于环形缓冲机制下的VxWorks字符设备驱动程序开发者具有参考价值。

军用PDA;VxWorks;环形缓冲区;驱动

VxWorks作为一种强实时性的操作系统RTOS,广泛应用于诸如单兵手持终端、军用PDA等用户定制的计算机上。这类嵌入式计算机,按照用途的不同,定制硬件时所采用的CPU类型和相关外设都有所区别。VxWorks系统能够支持ARM、PowerPC、X86等大多数类型的CPU,但不同的硬件外设要求VxWorks系统必须提供相应的驱动程序[1]。因此,开发外设的驱动是在不同硬件平台上移植VxWorks操作系统的关键[2]。文中以开发串口驱动为例,VxWorks系统环形缓冲机制在驱动设计中发挥了重要作用。

1 VxWorks系统环形缓冲机制和驱动程序

VxWorks系统环形缓冲机制可以更便捷地实现上层应用和底层硬件之间的读写操作,当上层应用的访问操作速度和底层硬件操作寄存器的速度存在较大的差异时,可以起到良好的缓冲作用,大大减少丢包率[3]。

图1 环形缓冲区读写操作

1.1 环形缓冲机制

VxWorks中的环形缓冲[4,5]是基于先进先出(FIFO)的原则,并且提供了环形缓冲的数据结构,用户对缓冲的使用只需要操作对应的数据结构即可,读写操作如图1所示。对于环形缓冲,读写指针各自独立,读写操作不需要系统内核提供任务同步或互斥的操作,所以读任务和写任务可以同时访问环形缓冲,而无须互斥信号量的介入。但是,在运行多任务的系统中,如果存在多个读任务和多个写任务同时操作环形缓冲,则需要应用互斥操作机制。

1.2 驱动程序

对于用户开发的嵌入式计算机,硬件外设通常是根据特定的需求定制的,所以一般采用非标准的驱动开发。驱动程序介于底层硬件和上层应用之间,用于屏蔽不同硬件平台的差异,方便上层操作系统和应用程序的移植。在VxWorks操纵系统中,外部设备驱动程序通常被分成3大类型:字符设备驱动程序、块设备驱动程序和网络设备驱动程序[6]。下面所论及的驱动主要是基于字符设备进行的。

驱动程序一般包括3个部分:对硬件的相关配置和初始化操作、硬件的功能性实现以及与上层应用的接口函数[7],其功能说明如下。

1)初始化操作主要包括驱动程序用到的数据结构的初始化,硬件初始化中相关寄存器的配置,以及硬件启动前中断服务程序的挂接。通常在中断服务程序的挂接之前,要禁止其相关的中断,挂接完成之后,再开启该中断。这样可以避免硬件中断到来而中断服务程序尚未挂接好时,所引起的意外状况。

2)启动系统运行后台的定时查询机制,或者利用中断机制设计相应的中断处理程序实现对硬件中断的响应,实现硬件功能。

3)提供给上层应用程序与硬件交互的接口,一般包括设备的打开,关闭,相关参数的配置,数据的发送,数据的接收等。

2 驱动程序设计实现原理

文中涉及的硬件环境,CPU采用的是TSC695,它是高可靠性、高性能具有容错抗辐射功能的32位SPARC RISC结构的处理器,存储器包括RAM、PROM以及FLASH,串行通信是利用FPGA器件自定义设计的六路串口,这里以串口通信为例,利用环形缓冲机制,介绍驱动程序的设计。

2.1 自定义串口驱动程序设计

该六路串口为自定义的串口,所以采用非标准的驱动程序架构实现。驱动程序按照上节中提到的3个部分来实行,即对硬件的相关配置和初始化操作、硬件的功能性实现、与上层应用的接口函数[8]。该驱动实现的结构框图如图2所示。

图2 驱动程序实现框图

首先建立串口的数据结构,包括基地址定义,发送缓冲区句柄,接收缓冲区句柄,波特率设置,打开标志。初始化串口的数据结构,对于每一个串口都需要建立对应的发送缓冲区和接收缓冲区。采用这种方式可以同时驱动多个串口,本设计中用到了6路串口,这样只需在程序中添加6个串口的设备序号,然后根据串口设备号,调用串口的数据结构指针即可。

如图2所示,发送缓冲区和接收缓冲区是用户应用函数接口和底层硬件操作的桥梁。对发送操作而言,当用户调用发送函数发送数据时,实际上只需把数据写入发送缓冲区即可,后台的定时查询程序会定时的把数据读出,或者响应硬件发送中断将数据读出,然后把从发送缓冲区读出的数据写到串口的发送数据寄存器。对于接收操作而言,用户调用接收函数接收数据时,实际上只是从接收缓冲区中读取有效数据,后台的定时查询程序会定时的读取串口的接收数据寄存器,或者响应串口的接收中断读取串口接收数据寄存器,然后将从硬件上接收到的数据写入到接收缓冲区中,如果接收缓冲区没有接收到数据,则用户的接收函数返回结果零,反之,返回接收到的数据个数,并将数据写入用户指定的数组中。若用中断机制,需要调用函数intConnet挂接指定的程序来代替中断服务程序。

提供给上层应用的接口函数,仿照标准驱动程序函数的实现[9-10],具体接口函数如表1所示。

表1 应用层接口函数

2.2 机制应用

串口的处理过程可以分为两种,定时查询和中断处理[11,13]。

1)定时查询,好处是在传输大容量数据时,可以避免因CPU频繁地响应串口的字节中断而造成CPU资源紧张。本文的自定义六路串口,采用FPAG设计,串口FIFO的大小是128字节,提供了FIFO的满中断,半满中断,非空中断,空中断等标志,驱动程序可以通过定时的检测FIFO的标志位,根据FIFO当前的状态接收或者发送,而且是一次性的将FIFO中的数据发送或者接收,这样提高了串口的收发效率。

定时查询机制利用的是VxWorks操作系统提供的看门狗定时器,该定时器的管理函数库为wdLib。wdLib库提供了通用的看门狗定时器模块,任何任务都可以创建看门狗定时器,并在指定延迟之后,在系统时钟ISR的上下文运行一个指定的程序。调用wdCreate()创建一个看门狗定时器,然后调用wdStart()启用,当延迟时间到达时,系统执行wdStart()函数指定的超时程序。由于看门狗定时器仅执行一次,但对设计的定时查询程序来说,需要周期性的执行定时器,所以在超时程序中必须自身调用wdStart()函数来重新启动定时器。

需要注意的问题是,VxWorks系统在中断级调用超时程序,而不是在任务的上下文中。因此超时程序的设计规则与中断服务程序是类似的,即程序中不能获取信号量,不可以调用printf()等。

2)中断处理,优点是可以及时响应硬件中断,在传输数据量不大的情况下,是更优的选择。中断服务程序完成对硬件的响应,确认中断源,清除中断。通常中断服务程序自身不处理过多的事情,而是利用系统提供的通信机制启动相应的任务完成后续的处理。当串口接收数据时,产生接收中断,系统中断机制调用中断处理程序判断中断是接收中断,读数据寄存器,将数据放入接收缓冲区;当发送数据时,先将第一个字节写入数据寄存器,用以启动发送空中断,将其他待发送数据放入接收缓冲区,中断发生时,中断服务程序判断发送缓冲非空,将数据送到数据寄存器,同时清中断。

为方便系统调用,在运行过程中,可以根据需要改变串口的工作方式,比如设置新的波特率、新的方式字等,要求设计UartIoctl()函数。需要注意的是,如果使用中断方式,当设置波特率时,需要在禁止系统中断的条件下完成,即设置波特率前,调用intLock函数禁止中断,设置完成后调用intUnlock函数恢复系统中断设置。

3 在vxWorks系统中的具体实施

3.1 环形缓冲区数据结构设计

VxWorks提供的环形缓冲区数据结构相关定义在rngLib.h中,定义如下:

为了在多线程中能够很好使用,不发生读写冲突,增加了读写锁。设计的增强环形缓冲区结构定义如下:

3.2 串口设备数据结构设计

串口设备的设备描述结构定义如下:

3.3 数据缓冲区读写操作

对于VxWorks环形缓冲区的读写操作,在引入了读写数据锁后,读写指针的值就不会出现错误值,保证了多任务下数据进出缓冲区的正确率。其基本代码如下:

当操作底层硬件与接收缓冲区的数据传输时,根据FIFO的标志,调用readbuf()函数时设置Maxbytes分别为128、64或1;当操作底层硬件与发送缓冲区的数据传输时,根据FIFO的标志,调用writebuf()函数时设置 Maxbytes分别为1、64或128;而应用层接口函数 UartWrite()和 UartRead()调用 readbuf()和 writebuf()时,Maxbytes=len。

驱动程序开发完成后,将驱动程序库和VxWorks操作系统编译融合在一起,VxWorks启动后,调用驱动程序中的硬件初始化函数,挂接中断服务程序,在查询方式的情况下,启用后台的定时查询函数[14-16]。这样用户开发上层应用程序的软硬件平台就搭建好了。对于其他字符设备驱动程序的开发应用[17],与此类似。

4 结束语

文中以串口通信为例,重点讨论了在VxWorks操作系统下,利用VxWorks环形缓冲机制进行TSC695处理器的自定义驱动程序的开发,在一定程度上提高了CPU的利用率和通信效率,减少了丢包率,对系统的可靠性和稳定性[18]有一定的改进。

[1]孔祥营,柏桂枝.嵌入式实时操作系统VxWorks及其开发环境Tornado[M].北京:中国电力出版社,2003.

[2]张原,邹程帅,张帅,等.基于VxWorks的PCI总线多功能数据采集卡驱动开发[J].电子设计工程,2012(12):45-47.

[3]姚章俊,陈蜀宇,卢尧.一种高性能环形缓冲区的研究和实现[J].计算机工程,2012,38(8):228-231.

[4]徐勤朋,刘荫忠.基于缓冲区的两级插补器的研究与设计[J].组合机床与自动化加工技术,2014(3):9-12.

[5]蔡伟,周乃恩.基于环形缓存技术的无人机数据接口设备设计[J].微型机与应用,2013,32(2):7-8.

[6]基于嵌入式操作系统VxWorks的I2C总线驱动设计[J].单片机与嵌入式系统应用,2015(8):34-37.

[7]强新建,田泽,淮治华.VxWorks下驱动程序设计[J].西安石油大学学报:自然科学版,2010,25(3):11,94-96,104.

[8]李伟,李杰涛,韦金生.VxWorks下多串口卡驱动程序设计初探[J].硅谷,2013(13):48,194.

[9]莫进军.实时操作系统VxWorks下实现串口通信的方法[J].信息与电脑,2011(4):169,171.

[10]官琴,王璐.基于VxWorks嵌入式系统的多串口驱动程序开发[J].兵工自动化,2011,30(6):94-96.

[11]陈楸,程鹏飞,吴成富,等.基于VxWorks定时中断的自适应串口驱动设计[J].测控技术,2012,31(7):103-105.

[12]凌约雷,邱爱华,席隆,等.国产高可靠控制器BM3803MG的BSP设计[J].电子技术应用,2012(1):24-27.

[13]高常波.Vxworks下多串口扩展卡驱动实现[J].通信技术,2010(4):47-49.

[14]Wind River System,Inc VxWorks 6.1 Programmer’s Guide[M].2012.

[15]Wind River System,IncBSP Developer’sKit User’s Guide[M].2012.

[16]曹桂平.VxWorks设备驱动开发详解[M].电子工业出版社,2011.

[17]张煜,陈欣,宋力兵,等.基于MPC8280的CPU单元与内部总线驱动程序设计[J].电子设计工程,2014,22(19):43-46.

[18]白少卿,孙亮.膜片阀破裂压力稳定性研究[J].火箭推进,2015(6):46.

Driver design based on ring buffer in VxWorks

TANG Xiao-bei1,DU Xiao-xue2,SUI Jiang-bo3
(1.Naval Research Institute of Drill Equipment,Beijing 102308,china;2.Weapon Department,North Sea Fleet,qingdao 266011,china;3.Department 5,Naval Aeronautical and Astronautical University,Yantai 264001,china)

For development requirements of standard driving of the military PDA custom hardware in VxWorks embedded operation system,Analyzed the driver function design of VxWorks embedded operating system,with multiple serial ports driver as an example,combined with the watchdog timer and interrupt handling mechanism,used thering managementinterface function VxWorks System itself provides,designed a more efficient and reliable,stable performance of the driver of character device,reduced the rateof loss of communication and improved the efficiency.All reference value based on VxWorks character device driver developers to thering.

military PDA; VxWorks; ring buffer; driver

TN954

A

1674-6236(2017)16-0037-05

2016-05-18稿件编号:201605178

唐小贝(1975—),男,湖南洞口人,硕士,工程师。研究方向:作战仿真、软件建模、系统工程。

猜你喜欢

服务程序驱动程序缓冲区
SylixOS系统的中断嵌套机制研究与实现
基于C#的进程守护程序的设计
UDP穿透NAT技术实现数据唤醒车联网T-Box设备的方案
计算机硬件设备驱动程序分析
基于网络聚类与自适应概率的数据库缓冲区替换*
嫩江重要省界缓冲区水质单因子评价法研究
水利工程施工监理服务程序及质量控制
关键链技术缓冲区的确定方法研究
基于MPC8280的CPU单元与内部总线驱动程序设计
AVS标准中的视频码流缓冲区校验模型分析