嵌入式系统在气浮转台无线测控实验中的应用
2008-07-16
作者:曲宏松1,2,张 叶1,2,徐
摘 要: 以卫星气浮转台实验为背景,介绍了基于实时嵌入式系统" title="嵌入式系统">嵌入式系统的气浮转台无线测控通信子系统的设计。利用VxWorks操作系统实时性强、多任务" title="多任务">多任务调度的特点,对转台上的串口" title="串口">串口数据采集、转台上下的无线网络通信进行了任务化编程。在线测试表明,嵌入式实时操作系统VxWorks可以合理而快速地对各任务进行实时而可靠的管理和调度,嵌入式系统可以出色地完成转台无线测控通信任务。
关键词: 气浮转台 无线网 VxWorks 嵌入式系统
在卫星的地面全物理或半物理仿真实验中,气浮转台作为卫星的运动仿真器,不仅可以模拟卫星的刚性本体,而且要承载转台控制系统、测控通信系统等实物部件,所以气浮转台是卫星控制系统物理仿真实验的核心设备。由于在仿真实验中需要将转台上的各种实验数据实时下传到台下的监控计算机中,并且有时需要台下的监控计算机上传必要的遥控指令和数据信息至台上的控制计算机,因此需要有一套实时性、鲁棒性很强的测控系统来完成转台上下的通信任务。
当前,嵌入式技术发展迅猛,已经广泛渗透到科学研究、工程设计、军事技术以及人们的日常生活中。VxWorks作为一款实时嵌入式操作系统,以其强实时性、高可靠性成为航空航天、军事国防、通信等领域应用最广的操作系统之一。而PC104设备采用了紧固堆叠的安装方式,体积小巧、结构紧凑,特别适合转台这种空间有限的应用。本系统针对气浮转台实验的实际需要,并结合嵌入式系统的特点,最终选取了“VxWorks+PC104”的嵌入式软硬件搭配方式,完成转台数据采集管理、转台控制以及台上的测控终端" title="测控终端">测控终端等实验任务。
1 硬件实验环境
气浮转台测控实验要完成的中心任务是:将转台上的各系统、各设备的遥测数据下传到地面测控终端中,由地面测控终端进行处理、显示以及保存。同时,地面测控终端要将转台上所需要的数据信息以及一些控制指令上传到台上测控终端中。
1.1 台上实验环境
转台上采用PC104嵌入式计算机作为转台主控计算机,选用的型号是数字逻辑公司的CPU卡MSMP5SEV, VxWorks操作系统在此CPU卡上运行。为了能够采集台上设备的工程数据,并对台上的执行部件进行控制,通过PC104总线扩展了一个8COM的串口卡和一个D/A转换卡。台上的GPS接收机、光纤陀螺、自制飞轮电机通过串口与PC104串口卡相连,以传递GPS授时数据、转台转速以及飞轮转速等遥测数据。而自制飞轮电机和磁力矩器等执行部件连接到D/A转换卡上,由D/A卡发出的模拟信号控制执行部件。此外台上配有多路供电电源,为台上电子设备供电。
1.2 台下实验环境
转台下需要一个工业控制计算机作为地面的监控平台,负责接收转台传来的重要数据,并向台上传递控制命令及必要的实验数据。需要上传的数据有模拟卫星的轨道数据和转台感应同步器得到的转台位置信息。模拟卫星轨道数据可以利用STK软件得到,而转台感应同步器的数据则通过一个自制数据采集板,将并行数据转换成串行数据输入到监控计算机中。
1.3 转台上下的通信链路
由于转台在实验时不断转动,很不适合有线通信,所以选用无线局域网作为转台上下的数据通信链路。台上使用符合IEEE802.11g协议的无线接入点(Wireless Access Point)作为台上的测控连接点,通过网线接入到PC104主机。台下使用USB接口的无线网卡,直接插入到地面监控计算机中。这样就建立起一个无线点对点的局域网。图1给出了转台实验环境的总体结构图。
2 基于VxWorks的转台测控通信端软件开发
2.1 实时嵌入式操作系统VxWorks
VxWorks是美国风河公司(Windriver)为嵌入式系统量身打造的一款实时操作系统。其微秒量级的任务切换和中断延迟时间,使其成为实时操作系统家族中的佼佼者。经过二十多年市场应用的验证,VxWorks被认为是高度可靠的操作系统。
VxWorks除了强实时性和高可靠性之外,还具备多任务调度的特点。VxWorks中任务的概念类似Windows中的线程,每个明显单独运行的程序成为一个任务。每个任务都可以直接访问或共享大多数资源和内存空间,并拥有自己存放局部变量的栈和存放寄存器、延时定时器、时间片定时器等控制块。每个任务都拥有自己的任务名、任务ID和优先级。内核根据各任务优先级的高低,进行高优先级抢占式的调度,而对于同等优先级的任务采用轮转调度策略。VxWorks任务间的同步方式也比较灵活,分别提供了共享内存、管道、信号量、消息队列等机制。丰富的通信机制和调度方式选择使VxWorks下的任务编制非常灵活,十分适合在有限时间内同时处理多个事件。
2.2 测控系统软件设计
测控软件从功能角度分类可以分为遥测任务和遥控任务两个部分。遥测任务需要采集、整理转台上各设备的工程数据,然后通过网络发送到地面监控计算机中。遥控任务需要先通过网络接收到地面监控计算机发送来的数据,然后通过解包、解码发送给遥控处理任务来执行遥控指令。但从数据的通信类别角度分类,可以分为串口通信和网络通信两部分。从编程角度,更倾向于后一种分类来组织软件的编写。
2.2.1 串口通信
串口通信的主要任务是采集遥测数据。从图1可以看出,转台上有3路数据要通过串口进行通信,分别是GPS、陀螺和飞轮电机。由于3个设备的数据更新率不同(GPS为1Hz、陀螺为300Hz、飞轮电机为2Hz),所以对于PC104主机而言,遥测数据的到来具有随机性。为了能在各路遥测数据到来之际及时做出响应,需要利用VxWorks系统提供的I/O复用机制进行串口数据接收。具体程序代码如下:
if((xxxFd =open(″/tyCo/0″,O_RDWR,0))==ERROR)
{
perror(″Error in opening com1!″);
return(ERROR);
}
taskSpawn(TNAME_COMXXXRECV,TPRI_COMXXXRECV,0,XXX_STACK_SIZE,(FUNCPTR)xxxRecv,0,0,0,0,0,0,0,0,0,0);
STATUS xxxRecv(void)
{ …
while(1)
{
FD_ZERO(&readFds);
FD_SET(xxxFd,&readFds);
if(select (width,&readFds,NULL,NULL,NULL)==ERROR)
return (ERROR);
if(FD_ISSET(xxxFd,&readFds))
{
if((recvLen=read(xxxFd,recvBuf,buf_size))==ERROR)
{
printf(″ERROR when read XXX!);
return(ERROR);
}
……
//释放相应信号量,进行数据处理、遥测数据编码、下传数据打包等任务的执行。
……
}
}
}
首先,需要通过I/O系统API函数open()打开串口,系统为相应的串口分配一个表示该串口的文件标识符xxxFd,然后通过taskSpawn()函数发起串口接收任务。串口接收任务对应的入口函数为xxxRecv(),xxxRecv()函数的函数体是一个死循环,不断接收串口数据。在死循环的开始处应用I/O复用机制,利用FD_ISSET()函数查看文件描述符集的xxxFd位是否被置位。如果xxxFd所对应的串口有数据到来,底层的驱动程序会将数据传递到系统维护的接收环形队列缓冲内存中,同时将文件描述符集中的xxxFd位置位。当FD_ISSET()函数发现xxxFd位被置位时,则使串口接收任务解除阻塞,开始向下执行,通过read()函数将存放在环形队列中的数据接收到用户缓冲区recvBuf[]数组中。如果没有数据到来,则文件描述符集中的xxxFd位为复位状态,串口接收任务阻塞。通过使用I/O复用机制,成功地解决了不同数据源更新率不同步的难题。这种机制类似一个软中断,真正做到了数据的即到即收。
2.2.2 网络通信
无线网络通信担负着连接转台与地面监控计算机的重任。由于PC104主机带有网卡,而且VxWorks对多任务和BSD Socket具有良好的支持,所以完备的嵌入式软硬件环境使得无线网络通信在转台测控系统中的应用成为可能。
网络通信任务是基于BSD Socket的编程,使用的是Server/Client模式。转台上的嵌入式主机为服务器(Server),台下的监控计算机为客户端(Client)。BSD Socket通常构造两种应用类型:面向连接的SOCK_STREAM应用和无连接的SOCK_DGRAM应用。面向连接的应用即基于TCP协议的socket应用,无连接的应用即UDP应用。TCP协议是提供给用户的一种可靠的全双工面向连接的协议,而且TCP协议具有正确性检查机制。在此选用TCP协议进行网络通信。
基于TCP协议面向连接的Socket应用框架如图2所示。首先,在服务器端创建Socket,然后调用bind()函数将Socket与一个端点地址绑定,并通过listen()函数侦听客户的连接请求,然后调用accept()阻塞任务,等待请求的到来。当客户端利用connect()连接到服务器的侦听端口时,服务器与客户端进行3次握手建立点到点的连接。连接建立完毕以后,就可以调用read()和write()函数进行网络数据的接收和发送了。
从图3可以看出,网络通信应用程序中建立了两个缓冲队列,用来缓冲网络接收和网络发送数据。缓冲队列由链表" title="链表">链表数据结构的动态添加与删除来实现。为了节省空间,没有用VxWorks自身提供的双向链表结构,而是用单向链表,并用两个全局指针来记录链表头尾的首地址,用一个全局变量来记录链表的长度,以省略查找的过程。
每个链表元素为一个结构体struct xxxList,结构体内容包含网络数据头指针pTemp和指向下一个元素的指针pNext。全局变量为链表头的指针listHead、指向链表尾的指针listRear以及链表的长度变量listLen。图4表示含有n个元素的链表结构。
使用缓冲队列可以有效地提高通信的可靠性。在没有缓冲队列的情况下,虽然实时性极强的VxWorks在绝大多数情况下能够保证对需要传递的数据进行及时的处理,但仍然不能避免数据缺失情况的发生。而如果有一帧关键数据丢失,则有可能造成某任务的阻塞。当阻塞时间超时,可能引起Watchdog的启动,从而中止实验的进行。而加入缓冲队列可以使尚未来得及处理的数据得到保护,从而避免了数据的丢失。从另一种角度说,也提高了CPU的利用率。
3 多任务调度测试
由于转台上只有一台嵌入式控制主机,所以台上各种数据的采集、控制算法的实现、转台的自主管理等功能都将由这个嵌入式主机单独完成。VxWorks强大而灵活的多任务调度管理能力可以协助嵌入式PC104主机完成这些功能。
在转台仿真实验进行过程中,VxWorks操作系统将同时维护二十多个任务。对于用户来说,要明确各任务的运行状况就必须了解系统对多个任务调度的情况,从而发现编程时考虑不周的bug。VxWorks的开发环境Tornado为用户提供了一个动态监视工具WindView,此工具可以在Target端的实时系统运行过程中记录各个元素之间动态交互的信息,然后在Host端用图形化的方式直观地显示出来。
图5给出了进行转台仿真实验过程中,用WindView采集到的各任务占用CPU的时序。通过WindView图可以看出,虽然系统维护的任务很多,而且有的任务被调用或者响应中断的频率很高,但由于VxWorks操作系统实时多任务调度的能力很强,所以没有造成任务的拥堵、死锁或者饥饿等情况的发生,圆满地完成了转台的仿真实验。
参考文献
[1] VxWorks Programmer′s Guide.Wind River System Inc,2002.
[2] Tornado 2.2 User′s Guide.Wind River System Inc,2002.
[3] 陈洋,陆宇平.机器人实时远程控制系统及其开发库的设计与实现[J].电子技术应用,2006,(2):7-10.
[4] 孔祥营,柏桂枝.嵌入式实时操作系统VxWorks及其开发环境Tornado[M].北京:中国电力出版社,2001.
[5] 程敬原.VxWorks软件开发项目实例完全解析[M].北京:中国电力出版社,2005.
[6] 邝坚.Tornado/VxWorks入门与提高[M].北京:科学出版社,2004.
[7] 曲宏松,耿爱辉,陈涛.基于VxWorks的串口芯片ST16C554的驱动程序设计[J].电子器件,2006,(3):959-962.