王少虎,刘亚斌
(北京航空航天大学自动化科学与电气工程学院,北京100191)
飞控组件综合测试系统主要用以对某型号产品的飞控组件的电气性能、功能、时序进行全面调试与测试,并隔离、定位和分析故障,完成常温、高低温性能测试、振动和冲击测试。飞控组件与载机、导引头、舵机等通讯,不断发出代表自身工作状态的LVDS遥测信息[1]。测试系统中的LVDS遥测采集卡需实时采集LVDS遥测信息,并存储、显示。Win⁃dows系统实时性差[2],在采集LVDS遥测信息过程中时常会出现丢帧、误码现象。本测试系统要求在有限的、确定的时间内实现一个周期数据的采集。鉴于Windows7良好的人机交互界面、强大的图形显示和数据处理功能[3],并考虑到各类实时系统或开发工具的实时性能、开发难度、软件可移植性、成本等因素,选取RTX2012对Windows 7系统进行硬实时扩展[3],进行LVDS遥测采集卡的RTX驱动程序开发。
LVDS遥测采集卡主要用于接收飞控组件发出的LVDS遥测信号[4],主要特性有:PXI总线接口;一帧255个遥测数据,每6 ms中断一次,完成一帧数据上传;接收字数可软件设置,数据接收时板卡自动存储,至少可记录十分钟遥测数据,且不丢帧;传输速率32 MB/s;传输距离≥5 m。
LVDS遥测信号只含有1路数据信号和1路时钟信号[5]。本采集卡主要有两大功能模块:LVDS遥测信号收发模块、PXI/CPCI总线接口模块。两个模块以一片FPGA(型号为EP1C12Q240)为核心,利用FPGA实现硬件总体时序逻辑控制、LVDS遥测信号的采集/发送功能。硬件总体设计框架如图1所示。
图1 LVDS遥测采集卡硬件结构框架
RTX2012(Real Time Extension 2012)是 Interval Zero公司的重要产品,通过对Windows的硬件抽象层进行硬实时扩展[6],设计实现实时任务的管理、调度。它没有对Windows系统进行修改或封装[7],支持部分win32API函数,并拥有一套RTAPI实时函数(中断处理函数为RTAPI独有)[8],方便平台间共享、移植软件程序。
RTX2012实时子系统采用抢占式优先级[9],分127个线程优先级,RTSS线程优先于所有的Windows线程[10];实时特性达微秒级,保证上下文线程切换,使得在亚微妙范围内的线程优先级更高;完全支持多核CPU,可指定RTX在独占的核上运行;能精确控制IRQ、I/O、内存等[11]。
RTX2012支持PCI/PCI-E总线上基于消息、线性的中断[12],使得配置Win 7系统信息变得简单;RTX2012可以通过信号量、互斥体以及共享内存等高速IPC对象和同步机制[13],实现RTX与Windows之间数据交换。其定时器时钟频率为100ns,最低定时器周期为 100 μs,并支持实时以太网、USB 通讯[14]。RTX2012支持Microsoft Visual Studio 2010/2008/2005,使得不同版本开发工具开发出的软件程序可以较好兼容。
利用Visual Studio2010+RTX2012开发RTX驱动,通过VS2010中“RTX Device Driver”选项按向导创建驱动程序框架,添加对应功能函数代码,经编译、运行,最后生成.rtss文件。
利用向导快速创建的RTX驱动程序框架,主要提供了设备管理和中断管理方面的基本函数[15],供开发人员调用以完成对设备的初始化、清除设备资源、中断处理等功能。
DeviceSearch函数用于设备查找;DeviceInit函数用于获取板卡的内存空间、中断号等硬件资源;RtGetBusDataByOffset函数用于访问9054配置空间,获取本地寄存器和存储空间内存与中断信息[16];Rt⁃TranslateBusAddress和RtMapMemory函数将物理地址映射为虚拟地址,用基地址加上偏移量,RTX驱动程序就可读写本地寄存器或内存空间[17];Device⁃Cleanup用于释放板卡硬件资源。RtCreateShared⁃Memory和RtOpenSharedMemory用于创建、打开共享内存;RtCloseHandle用于释放共享内存;DeviceISR函数判断中断来源;DeviceIST函数处理中断;RtAt⁃tachInterruptVectorEx将中断向量与中断服务线程IST、中断服务例程ISR相关联[18],针对中断是否共享、中断电平触发方式、传递上下文等进行对应设置。
进入主函数main()中,首选创建互斥体对象,防止其他线程对某一数据进行同时访问。随后,为设备创建控制资源,这些控制资源主要包括以下:Windows指向RTX的事件对象hW2REvent,RTX指向Windows的事件对象hR2WEvent,Windows和RTX之间的共享内存对象hDevCtrlShare,RTX命令接收线程对象hCmdThread。其中每块板卡都将会创建一个命令接收线程,而且接收线程的入口地址相同。如果在创建这些控制资源的过程中,任何一个资源创建失败,则退出主函数;反之,所有控制资源都创建成功,则挂起当前线程,等待用户发出相应的Windows指令,就进入RTX命令接收线程进行相应处理。
板卡初始化函数的声明为int InitializeO⁃neDevRtss(ULONG DevNum);,首先判断板卡是否打开,如果已经打开,则返回-1,表示初始化失败。如果板卡尚未打开,则利用DeviceSearch函数,根据vendorID和deviceID查询PXI总线上所有设备[19],LVDS遥测采集卡vendorID、deviceID依次为0x10b5、0x0104,查询到LVDS遥测卡后,返回设备的bus、slot和ConfigData信息,并进行一系列的板卡硬件资源的初始化任务[20],主要包括对9054寄存器、Local寄存器基地址获取、内存映射。之后,禁止中断,通过PciGetIrq获取中断请求Irq,并通过RtAttachInterrup⁃tVectorEx函数进行中断连接[21]。连接中断成功后,清除中断。随后,利用RtCreateLock函数创建发送时钟、接收时钟,并用RtCreateEvent函数创建接收完成事件通知。如果所有操作都未返回FALSE,则板卡打开状态变量bOpened置为TRUE,板卡初始化成功。否则,初始化失败,并利用CleanUpOneDevRtss(ULONG DevNum)释放已经获得的板卡资源。
清除设备的函数声明为void CleanU⁃pOneDevRtss(ULONG DevNum);,当初始化失败时或关闭板卡时,需调用该清除设备函数。首先,禁止中断,取消9054和本地地址空间的内存映射,之后,取消中断连接,关闭已经创建的发送Lock、接收Lock句柄以及接收完成事件,最后将板卡打开状态变量RtssDevCtrl[DevNum].bOpened置为FALSE,即可完成板卡资源释放清除功能。
中断处理函数的声明形式为BOOLEAN RTAPI IST(PVOID pContext);,中断处理流程见图2。
图2 中断处理流程
当有中断产生时,进入DeviceISR判断中断来源和类型,读取中断状态寄存器的值。如果不是本设备中断,就将中断传递到下一个共享该中断号的设备;如果是本设备中断,先禁止中断,再清除中断,并加锁以同步,判断设备是否开始接收数据。当设备没有开始接收时,就设置接收数目,并将数据从硬件底层读取放入驱动缓冲区中,数据接收完成时,就设置接收完成事件,并解锁,允许中断,继续等待下一个中断到来,完成数据接收。其中,将数据从硬件板卡上读到驱动FIFO中的代码实现如下:
该函数的声明形式为DWORD WINAPI RtxCmdThread(PVOID param);,用户通过 Windows友好的交互界面下发不同的操作命令,主函数接收命令,并传入RTX命令接收线程。RTX根据接收到Windows发出的不同命令进行相应的处理,这些命令主要包括打开板卡、关闭关闭、开始接收、停止接收操作。具体代码实现如下:
为了更好实现LVDS遥测卡的各项功能,还需要封装一些用户接口函数,主要包括板卡的打开、关闭、发送数据、停止发送、接收数据、停止接收等。函数封装的具体形式如下:
通过共享内存(ShareMemory)和信号量(Sema⁃phore),实时进程RTSS与上层应用程序Win32进程实现数据共享,通信过程如图3所示。
图3 RTSS与Win32通信简图
当RTSS访问共享内存中数据时,向共享内存发送请求访问信号量;共享内存接到请求信号量,向上层Win32发送询问信号量。如果上层应用已经准备好并将数据写入共享内存,在收到询问信号量后,则下发准备好信号量。此时,共享内存再返回可以访问信号量给RTSS,RTSS就可以从共享内存中读取数据。反之,当上层Win32进程需要访问共享内存数据时,过程同理。
对Windows下开发的LVDS遥测采集卡WDM驱动程序进行多次测试,板卡自检结果如图4所示,出现了丢帧、误码的情况。这是因为飞控组件综合测试系统对实时性要求较高,要求每6 ms来一次中断,完成一帧数据256字节的上传,而Windows系统的最小时间粒度仅为10 ms,无法满足实时性要求[22]。相应的利用Windows7+RTX2012开发的RTX驱动程序进行多次重复测试,结果如图5所示,接收到的数据与发送的数据完全吻合,表明设计开发的LVDS遥测采集卡的RTX驱动程序实时、准确、可靠的完成了板卡的数据接收任务,很好地满足了系统对数据接收实时性的要求。
鉴于飞控组件综合测试系统对接收LVDS遥测信息的实时性要求,开发了Win7+RTX2012下的LVDS遥测采集卡的RTX驱动程序。本文详细介绍RTX2012的驱动程序开发要点,并给出了详实的开发过程和方法。经反复测试,该RTX驱动程序运行稳定。目前,所开发的RTX驱动程序已应用于测试设备,能准确、实时地完成LVDS遥测信号接收任务。
图4 Windows驱动程序测试结果
图5 RTX驱动程序测试结果
参考文献:
[1]姜日东,徐志跃.基于PCI总线无时钟LVDS数据采集卡的研究[J].电子设计工程,2013(17):100-102.
[2]杨维,石德乾.基于Windows XP+RTX的火控调试平台软件设计[J].火炮发射与控制学报,2013(4):30-34.
[3]刘婷,蔡鹏飞.Windows7的推广与用户实际应用习惯的磨合[J].电脑编程技巧与维护,2013(2):113-114.
[4]胡建,张红波.某型导弹飞控系统遥测信息接收装置设计[J].电子设计工,2012(13):69-70,75.
[5]邵华,刘亚斌,徐志跃.实时高速LVDS串行数据采集系统的设计[J].计算机测量与控制,2008(3):424-426.
[6]Ardence公司.RTX技术白皮书[S].北京航天捷越(美斯比)科技有限公司,2004.
[7]韩玉芹.基于RTX子系统的导弹试验实时测控系统研发[D].西安:西安电子科技大,2013.
[8]王立红,方华.基于WINDOWS+RTX的舰炮火控测试评估系统开发[J].火力与指挥控制,2012,(11):199-201,205.
[9]董晓明.抢占式动态优先级实时调度算法[J].职业,2012(29):91.
[10]金相男.基于Ardence RTX的1553B驱动程序开发[J].电子设计工程,2014(2):149-151,155.
[11]王伟志,袭著有,王贽.基于RTX实时仿真系统的设计与实现[J].电子设计工程,2013(12):24-27.
[12]张前福,王华闯,许俊平,等.基于RTX的实时处理系统设计[J].微电子学与计算机,2012(8):58-61,65.
[13]张蓓蕾,夏伟杰,周建江.基于RTX的舵机控制系统研制[J].电子科,2011(11):77-79.
[14]黄键,庞亚华,薛顺虎.RTX环境下PCI设备实时驱动的开发[J].计算机工程,2010(20):211-213.
[15]吴佳楠,王伟,周军涛,等.基于RTX实时模块的飞控系统综合测试系统实现[J].测控技术,2010(9):72-76,84.
[16]王道彬,陈怀民,别洪武,等.基于RTX的实时测控系统软件设计[J].火力与指挥控制,2009(8):125-127.
[17]詹金勇.PXI/PCI总线设备驱动程序设计及应用[D].武汉:华中科技大学,2011.
[18]武文峰,张泓.基于RTX的PXI板卡驱动程序开发[J].航空兵器,2012(3):51-54.
[19]付文芳,张萍.RTX下PCI9052驱动程的开发[J].科技广场,2006(8):97-100.
[20]李宏科.一种基于RTX的实时系统的实现[J].装备制造技术,2006(3):55-56,65.
[21]张帆,史彩成.Windows驱动开发技术详解[M].北京:电子工业出版社,2008.
[22]胡浩.基于RTX实时系统ARINC429总线通信驱动开发[J].计算机测量与控制,2015(1):310-312.