基于VxWorks的BMK卡的软件测试系统研究
2014-09-26王煊
王煊
(中国空空导弹研究院 河南 洛阳 471009)
首先,本文详细探讨了基于VxWorks的PXI板卡驱动程序的开发,总结出PXI驱动开发的具体流程,阐述了驱动程序中各功能模块的实现方法和技术要点,完成了BMK卡在VxWorks系统下的驱动程序开发与调试工作,尤其是DMA数据传输部分的实现,填补了国防型号测试系统中的空白,满足了研制的急需性。其次,论文重点说明了系统应用程序的设计,实现了VxWorks端与Windows端跨平台的通信,分别详细说明了客户端和服务端的网络通信程序的设计与实现,为嵌入式软件的远程控制奠定了基础。最后给出了接口函数的列表,完成了整个系统的设计。
1 PXI总线BMK卡概述
基于PXI总线的BMK卡是空空导弹测试系统的重要组成部分,在遥测接收计算机上发挥重要作用。遥测计算机包括:6槽PXI机箱,PXI嵌入式控制器——PXI3800以及相应的PXI总线接口功能子单元和信号调理硬件。整体结构如图1。
本文所涉及的BMK卡测试系统是在VxWorks实时控制系统下设计的BMK的驱动,实时性较好,为微秒级,对研发高实时性系统奠定重要基础。此外在Windows系统下实现了用户界面的开发,人机交互界面良好。结构图如图2。
图1 遥测接收计算机框架图Fig.1 The telemetry receiving computer framework figure
图2 BMK卡测试程序结构图Fig.2 BMK card test program design chart
2 VxWorks下设备驱动程序研究与实现
VxWorks系统中输入输出设备宏观上被分为3种类型:字符设备、块设备和网络设备[2]。这种分类方法是根据硬件本身的特性来决定的。依照设备类型,VxWorks下设备驱动程序的管理也被分为3种模块:字符设备驱动程序模块、块设备驱动程序模块、网络设备驱动程序模块。每个模块对应一种设备类型,而每个模块中不同的设备包含的功能不一样。用户可以根据自己的需要在VxWorks下,创建不同的模块。
BMK卡为PXI设备,属于网络设备,其驱动程序应创建为网路设备驱动程序。
2.1 初始化模块
系统加电以后,加载VxWorks映像。然后处理器跳到加载映像的地址即 sysInit()的首地址开始执行,sysInit()完成最初的硬件初始化工作。再调用第二个子程序UserInit()来关闭所有硬件中断[5]。 其中 UserInit()的子程序 sysHInit()将硬件处于初始的安静状态,此时VxWorks系统内核还没有被激活,内存也没有被初始化。
主要工作如下:在config.h中定义INCLUDE_PCI,设置PCI_CFG_TYPE为PCI_CFG_NONE让BIOS来完成硬件资源配置;sysHWInit()做动态配置调用 sysPlx9054PciInit()查找设备和动态配置设备[1]。
2)重视项目化的过程考核。传统的高职大学英语课堂上,学生普遍认为只要期末根据教师所给定的复习重点临时抱抱佛脚,就能应付期末考试。而对于英语学习来说,在期末英语考试中,考试内容只有一小部分的听力考试,其余都是笔试,不能全面反映学生在一个学期内的学习成果。因此,在英语考试方面应当增加考试内容,将学习的过程纳入英语期末考评中,增加其占考评的比重。在核心素养培养下的英语课程考核应当包括对学生语言能力、学习能力、思维能力和文化意识方面的考核。
PXI3800的BSP对专门的PCI设备提供了支持,BMKCardInit()函数就是通过调用这些库函数来完成硬件搜索和资源配置功能的。
2.2 中断处理
对于中断,首先要进行中断挂接,其次进行中断处理模块。
中断挂接是在系统内核被激活后才被调用的,其主要工作是初始化DMA相关寄存器,为进行DMA操作做准备;挂接中断,将中断向量和中断服务程序相关联,并使能中断;创建互斥信号量,用于建立驱动程序和应用程序之间的特殊通信[3]。
一般情况PCI设备会共享中断,所以挂接要使用pciIntConnect来将所有共享中断的中断服务程序组成一个函数链,这样每次发生中断都会将这个链调用一遍,从而实现中断共享。
接收中断后进入中断处理模块。中断处理模块的主要工作是中断到来时判断是否为自己控制的设备发生的中断,是则继续处理,否则立即返回,交由其他中断服务程序处理。若为DMA0通道产生的中断,则释放互斥信号量通知应用程序处理刚通过DMA方式存入内存的数据;最后清中断。
由于所有的中断服务例程共享一个堆栈,没有任务控制模块,所以,在中断服务程序中不能使用可导致阻塞的函数,如 printf()、semTake()等。 另外,中断服务程序不允许使用浮点协处理器的函数,因为在 VxWorks中,intConnect()建立的中断服务程序不能保存并回复浮点寄存器,如果一定要在中断服务程序中使用浮点运算的话,必须使用fppArchLib库中的函数显式的保存和恢复浮点协处理器寄存器。
3 网络通信程序设计与实现
在VxWorks的BSP完成了网口的底层驱动和TCP/IP层上的协议加载后,用户程序需要的就是在TCP/IP层上进行网络通信。在本系统中,采用的是服务器 (server)和客户端(client)的通信方式。其实现过程如图3所示。
图3 服务器端与客户端的建立Fig.3 Socket connecting between server and client
3.1 VxWorks端网络通信程序设计
在服务器端,在Tornado2.2中利用VxWorks对socket的支持,其通信程序如下[4]:
1)创建套接字。创建 socket是利用函数 socket(AF_INET,SOCK_STREAM,0), 其 中 ,AF_INET 指 定 通 信 域 为TCP/IP协议簇,SOCK_STREAM是全双工的字节流。Socket调用成功后返回一个套接字描述符,接着对服务器地址等数据结构初始化并对字节顺序进行初始化。
2)bind (listenSkt, (struct sockaddr*) &serverAddr, sock AddrSize),将套接字口和端口号绑定在一起。
3)监听。函数 listen (listenSkt, 5)将在 listenSkt套接字指定的端口上开始监听,等待客户的连接请求。
4)建立连接。 函数 accept(listenSkt, (struct sockaddr*)(&clientAddr),&sockAddrSize)接收客户机的连接请求并为此建立一个连接。函数accept返回一个新的套接字描述符commuSkt来供连接使用,服务器可以在以前的socket上继续监听。
5)关闭连接。用函数close()来关闭一个套接字描述符。
6)发送和接收数据。函数send()用于从发送缓冲区读取指定字节长度的数据来发送。函数recv()从接收缓冲区接收指定字节长度的数据。
整个程序的运行,需要多任务的支持。在多任务操作系统VxWorks下,任务由唯一的ID来标识,并且对应某一个特定的任务名,系统支持256个优先级。在默认情况下,0为最高优先级,255为最低优先级。每个任务都有自己的状态,是下面一种或几种的组合状态:excute(正在执行),ready(就绪状态),pended(阻塞状态),delayed(延迟状态),suspended(挂起状态)。本系统中采用了默认的优先级抢占调度策略。
3.2 windows端通信程序的设计
Windows端通信程序是基于Windows socket的,windows socket定义了一套Microsoft Windows下网络编程接口。它提供了针对Windows的扩展函数库,使程序员可以充分的利用Windows消息驱动机制进行编程。
Windows socket通信的基础是套接字 (socket)。 利用socket进行通信,主要有两种方式。第一种是有连接的流方式,即需要在两个通信的应用程序之间建立一条连接链路。必须在两端确定通路后,数据才能被正确接收和发送。第二种是无连接的数据报文方式,这时通信的两台计算机把数据通过网络邮寄给对方,数据在传送过程中有可能会残缺,也有可能接收顺序与发出时顺序不同,这种方式支持双向的数据流,但并不保证数据的可靠、有序、无重复性。在本系统中采用的是有连接的流方式,用的是客户机/服务器模型。
对于VxWorks端来说,Windows属于客户机,客户机的界面用MFC进行编写,通过界面向服务器请求服务,并通过一套协议保证服务可以被提供或者接收,该协议需要被客户机和服务器所接受。在MFC中为套接字提供了类CAsyncSocket和 CSocket,由于CAsyncSocket不需要多线程,使用简单,虽然CAsyncSocket的发送和接收受到TCP/IP缓冲大小的限制,但是Windows作为上层界面控制的时候,数据量并不大,所以在本系统中采用CAsyncSocket类库中的函数。
创建函数:BOOL Create(UINT nSocketPort=0,int nSocketType=SOCK_STREAM,long lEvent=FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE,LPCTSTR lpszSocketAddress=NULL)
关 联 函 数 :BOOL Bind ( UINT nSocketPort, LPCTSTR lpszSocketAddress=NULL)
客户套接字连接函数:BOOL Connect(LPCTSTR lpszHostAddress, UINT nHostPort)
4 接口函数设计
接口函数包括发送例程和接收例程。
发送例程的设计分为以下几步:
1)应用程序把要发送的数据的缓冲区首指针和发送要求传递给驱动程序,发送要求包括通道号,发送方式,发送个数。
2)驱动程序将发送要求写入对应的寄存器地址。写发送命令字,然后请求获得该发送通道以及发送方式对应的发送缓冲区的信号量。若信号量获得成功,驱动程序就把将要发送的数据通过DMA传输的方式写入发送缓冲区;若信号量获得不成功,多请求几次,超过一次次数后函数返回,发送失败。对于单次发送的方式必须首先查询一个特定的标志位,该标志位表示的是发送是否准备好,只有查询到该标志位为0,才可以进行后面的操作。
相对于发送例程来说,接收例程要复杂一些[6]。
图4 接收例程流程图Fig.4 Receive routine flowchart
这里涉及到了两个任务的同步以及任务间的通信,采用了信号量的方式进行处理。VxWorks为信号量做了很好的优化,为任务间通信提供了最快捷的方式。信号量是互斥和任务同步的主要实现手段。
二进制信号量是速度最快、真正意义上的信号量。VxWorks专门为任务同步和互斥优化了这种信号量,这种信号量相当于总数为1的计数型信号量,也可以理解成一种开关。一个信号量只有唯一的任务可以获得,当一个任务释放信号量之后,其他的任务才可以重新获得这个信号量。
BMK的接口函数如下:
表1 BMK通信卡接口函数表Tab.1 BMK card interface functions list
5 结 论
本文设计了基于PXI总线的BMK卡的软件测试程序,该程序结构紧凑,功能齐全,并且在实时性系统VxWorks的操作下,确保了数据处理的迅速准确。该板卡工作稳定,可以实现收发数据,尤其在DMA传输过程中,保证了大量数据发送的及时性,适用于高实时性要求的系统。在国防中可以发挥重要作用。
[1]9054 Data Book Version 2.1,PCI 9054 Data Book[S].U.S:PLX,2000.
[2]Barbalance A.Performance Comparison of VxWorks, Linux,RTAI and Xenomai in a Hard Realctime Application[C]//Real-Time Conference,2007.
[3]卞红雨,曹明明.VxWorks下 PCI总线设备驱动程序设计[J].声学与电子工程,2005(3):42-45.
BIAN Hong-yu,CAO Ming-ming.PCI device driver design on VxWorks[J].Acoustics and Electronics Engineering,2005(3):42-45.
[4]程敬原.VxWorks软件开发项目实例[M].北京:中国电力出版社,2005:24-64.
[5]CHENG Jing-yuan,AN Qi,YANG Jun-feng.Algorithm design ofCPCIbackboard’sinterruptsmanagementbased on VxWorks’ multi-tasks[J].Plasma Science and Technology,2006,V8(5):614-617.
[6]孔祥营,柏桂枝.嵌入式实时操作系统VxWorks及其开发环境Tornado[M].北京:中国电力出版社,2002:114-116.