导引头实时系统仿真架构设计

2019-06-17 09:28韩丰娟丛潇雨郭山红付姣姣
计算机应用与软件 2019年6期
关键词:导引头实时性线程

韩丰娟 丛潇雨 郭山红 付姣姣

(南京理工大学电子工程与光电技术学院 江苏 南京 210094)

0 引 言

在导引头系统研制过程中,仿真验证占有非常重要的地位[1],为了能更接近于真实的作战场景,近年来导引头系统仿真对实时性的要求越来越高。目前实时系统仿真难于实现的原因主要有两方面,一方面是仿真多基于Windows操作系统,虽然Windows拥有强大的图形化接口与众多第三方硬件的支撑,但其存在着延迟不确定、线程优先级倒置、线程调度机制不确定、IO设备访问受限、定时器精度差等诸多问题,很难满足实时性要求。另一方面复杂的仿真系统多为多机互联的拓扑结构,目前常用的通信机制如红外、无线、USB等,很难实现多机间的实时通信。

为了提高Windows系统的实时性,满足硬实时系统严格的响应时间要求,本文采用了美国IntervlaZero公司的Windows操作系统实时性解决方案RTX[2]。该方案的实时性主要体现在以下三个方面:第一,相比于Windows下毫秒级的定时精度,RTX下可达到100 ns[3-4];第二,RTX能独立地进行中断管理,而不受Windows干扰[5],可以实现对中断的实时响应。第三,RTX对线程的控制透明、灵活,拥有更多的线程数和更高的优先级,线程间切换时间小于10 μs,能够大幅优化导引头回波产生和信号处理的时间,提高系统实时性。在满足实时性的同时,RTX可以通过共享内存的方式与Windows实现通信,从而保留了对C/C++标准模板库与图形化交互界面的支持。为了解决多机间通信同步的问题,本文采用了由反射内存卡+光纤Hub卡组成的反射内存网通信机制,它是一种实时网络[6],实现了基于总线公共存储策略的硬件级数据同步传输,具有速度快、通信协议简单、传输纠错能力强等优点。

基于以上的分析,本文提出了基于RTX+Windows+反射内存网的解决方案,完成了一种多机互联的导引头实时系统仿真架构设计,实现了对实时性和友好交互的兼顾。

1 导引头实时系统仿真架构

如图1所示,本文导引头实时系统仿真分为六个模块,分别是作战想定人机接口、导引头回波产生、导引头干扰产生、导引头接收机1、导引头接收机2、数据融合与场景演示。每个模块所在的计算机构成分布式控制节点,各节点通过反射内存卡在光纤HUB上实现互连,组成了一种星型结构的反射内存网络。整个系统在RTX下进行回波产生、干扰产生、信号处理、数据融合,在Windows下进行可视化展示,RTX与Windows通过共享内存进行通信,各个模块在中断机制的控制下通过反射内存网实现同步数据传输,进而实现实时仿真。

图1 导引头系统架构图

图2给出了系统的数据流程,用户在作战想定人机接口模块的Windows软件界面上输入装订信息,RTX应用程序通过共享内存读到装订信息后,再通过反射内存网将其分别发送给回波产生模块和干扰产生模块。两模块的RTX程序根据得到的信息计算出回波与干扰信号,并传送给导引头接收机1和导引头接收机2进行信号处理。接收机模块将处理得到的目标信息通过反射内存网传送给数据融合与场景演示模块,该模块在RTX系统下进行数据融合,然后将融合结果通过共享内存传送给Windows进行动画展示,最终完成整个导引头工作过程的实时仿真。

图2 数据流程图

2 关键技术实现

2.1 RTX与Windows的结合使用

(1) 在Windows下进行RTX开发。

RTX是在Windows环境下安装和运行的。IntervalZero公司将RTX封装为一个实时子系统RTSS,以驱动的形式加载在Windows上。开发人员可以使用Visual Studio(简称vs)工具来加载RTSS并进行RTX开发,具体步骤如下:

① 安装WDK(Windows Driver Kit)。

② 依次安装:RTX SDK、RTX runtime、RTX MM。

③ 在vs中新建RTX Application工程。

④ 在新建工程下调用RTSS的API函数RtAPI进行相关应用程序开发。

(2) RTX与Windows间的通信机制。

为了克服与Win32进程间数据交互的困难,RTX提供了IPC通信机制:共享内存、事件体、互斥体、信号量。其中共享内存实现进程间的数据交互[7-8],事件体、互斥体、信号量保证进程间的同步。本文基于该机制使系统具有实时性的同时能够实现友好的人机交互。

以数据融合与场景演示模块为例,在RTX下创建共享内存,然后将接收到的目标位置、速度等信息写入;在Windows下打开共享内存后便可将信息读出进行动画展示,其中对共享内存缓冲区访问的同步通过互斥体实现,任何一方对共享内存进行操作时,都需要对互斥体加锁,互斥体被释放后共享内存才可被另一方使用。该过程中用到的RtAPI函数如表1所示。

表1 RtAPI中IPC通信实现函数

2.2 RTX下反射内存卡驱动设计

本文导引头实时系统仿真中多机间的数据传输是通过反射内存网实现的,因此对RTX下反射内存卡驱动的开发十分关键。首先需要在RTX系统的Control Pannel工具中将设备从Windows移到RTX下。根据系统需要,本文的反射内存卡RTX驱动主要实现以下三个功能:开关设备、中断控制以及读写数据。驱动程序的流程如图3所示。下面对三个功能的实现分别进行阐述:

(1) 开关设备 打开反射内存卡的步骤如下:首先将驱动程序附加到硬件设备上;然后将总线地址转换为相应的系统逻辑地址,再映射到用户的虚拟地址空间;其次在I/O总线上设置设备的总线配置数据;最后使用得到的地址空间句柄对设备中断状态,DMA等进行初始化配置。

关闭反射内存卡只需关掉对设备进行操作的句柄,RTX会自己回收内存资源。

(2) 中断控制 中断控制包括中断使能、设置中断类型、发中断、响应中断与等中断五个部分。① 中断使能,首先创建事件对象,然后检查设备是否支持MSI或MSI-X,挂载中断,最后将中断线程/例程关联到line-based/message-based的硬件中断。② 设置中断类型,通过配置反射内存卡本地配置寄存器的中断状态位来实现。③ 发中断,即将中断节点、附加信息、控制位信息(NIC、NTN、NTD)写入到本地配置寄存器,其中写NIC将启动网络中断。④ 响应中断,启动网络中断后,中断响应函数将判断中断类型,然后设置相应的事件对象。⑤ 等中断,等待中断触发,获取事件对象句柄,然后取出中断附加信息(ISD)、中断节点(SID),最后重新设置中断类型。

(3) 读写数据 本文使用DMA和memcpy两种方式分别实现大数据块和小数据块的读写。

写数据时首先判断数据长度,若其小于DMA传输的最小值,则直接使用memcpy将用户数据复制到反射内存卡的内存中,否则,使用DMA进行传输。读数据时依旧首先判断数据长度,若其小于DMA传输的最小值,则直接使用memcpy将反射内存卡中的数据复制到用户申请的内存中,否则,使用DMA进行传输。其中DMA传输数据的步骤如下:判断传输方向;得到传输数据物理地址;利用中断的方式控制DMA对物理地址上的数据进行分块传输。

图3 驱动程序设计流程图

2.3 RTX下实现多线程

相比于Windows下多线程使用的诸多局限性,RTX留给用户的操作空间大,可支持多达997个独立进程,每个进程的线程数不设限,由用户自由设置。RTX的线程具有128个优先级且均高于Windows的所有线程和中断[9],线程间切换时间小于10 μs,因此使用RTX的多线程可以极大提高程序的实时性。本文对多线程的应用体现在两个方面,一是实现数据的传输与处理并发进行,本文的数据传输是通过DMA控制加反射内存网的方式实现,不需要占用主机CPU资源,因此在数据传输过程中闲置的CPU可以用来进行数据处理,从而大大提升系统的工作效率。二是通过RTX多线程将计算机的多核充分利用起来实现信号处理速度的提升,提高系统的实时性。RTX系统下线程创建及管理方法如下:

在RTX的Control Pannel工具中为系统分配内核,其中Windows至少分配一个核,其余供RTX使用。RTX程序中主线程会占用第一个核,剩余的内核可由开发人员按照需要自由分配给子线程,为了系统最优,一般建议一个核分配一个线程。此外,为线程分配的内核必须属于其父进程。RTX下创建使用线程的C++代码如下:

SetProcessAffinityMask(GetCurrentProcess(), 0x3E);

//为当前进程分配内核

ULONG RTFCNDCL childThread1(void*nContext)

{

//TODO:在此放入代码

}

childThread1=RtCreateThread(NULL,0,thread01,NULL,CREATE_SUSPENDED,NULL);

//创建子线程

RtSetThreadPriority(childThread1, 120);

//为子线程设置优先级

SetThreadAffinityMask(childThread1, 0x04);

//为子线程分配内核

ResumeThread(childThread1);

//启动子线程

SuspendThread(childThread1);

//挂起子线程

3 系统测试

本文首先对所实现的导引头实时仿真系统的准确性、实时性、与真实作战场景的相似性在高性能硬件下分别进行了验证。计算机CPU6核、主频3.7 GHz、32 GB内存,反射内存卡采用PCI-5565PIORC,PCIE接口,容量128 MB字节。

(1) 准确性验证 如图4所示,在作战想定人机接口模块输入装订信息,在数据融合与场景演示模块将数据导引头系统仿真结果通过Unity进行动画展示,可以得到目标的飞行状态,结果准确。

图4 装订信息输入界面

(2) 实时性验证 本文从以下四个方面分别验证实时性:

① 本文使用Latrey Time工具对仿真系统在采用RTX前后的延迟时间进行了测量,结果如图5所示,可以看到在Windows下系统延迟较大,且非常不稳定,最高延迟达32 ms,而RTX下系统延迟时间均小于10 μs,且相对稳定,符合实时系统要求。

图5 时延示意图

② 在RTX下使用RtGetClockTime()函数获取系统时间来计算中断响应时间,在Windows下使用QueryPerformanceFrequency()函数和QueryPerformanceConter()函数获取系统计时器频率和数值,计算得到Windows下的中断响应时间,进行10次测试后统计结果如图6所示。可以看到Windows下系统中断响应时间较大,且极不稳定,RTX下系统中断响应时间稳定在12 μs左右,符合实时系统要求。

图6 RTX与Windows中断响应时间比较

③ 使用CPUUsage工具和Monitor Utility工具获得CPU使用率和线程切换时间,在单线程和多线程下的CPU利用率如图7所示。可以看到,在多线程下CPU核的利用率大大提高。一次信号处理时间由2 s减少为0.5 s,提高了系统的实时性。通过查看Monitor的输出日志我们获得线程切换时间,最大为为7.5 μs,符合实时系统要求。

图7 CPU使用率打印信息

④ 使用RtGetClockTIme()函数获得传输时间,根据传输数据大小计算得到反射内存网数据传输率约为880 Mbit/s,满足实时传输要求。

(3) 与真实场景的相似性验证 分别对本文实时仿真系统与传统MATLAB软件仿真系统的响应延迟、信号处理时间与数据传输率进行测试,取二十次测试的平均值,同真实作战场景下的性能指标进行对比,得到表2。从表中可以看到,传统软件仿真系统响应延迟为10.4 ms,信号处理时间为2.7 s,而本文所设计的实时仿真系统响应延迟仅为8.7 μs,信号处理时间为540 ms,更加接近真实作战场景下系统响应延迟和信号处理时间。另一方面,本文设计的实时仿真系统采用模块化的设计,各模块之间的数据传输速为880 Mbit/s,相比于传统MATLAB单机软件仿真,更加接近于真实作战场景。

表2 仿真方案性能对比

4 结 语

本文使用RTX及反射内存网技术设计了一种导引头实时系统仿真架构,准确性高,实时性好,与传统的MATLAB软件仿真方案相比,更接近于真实作战环境。测试结果表明,系统仿真结果准确,计算机资源利用率较高,整体时延小于10 μs,中断响应约为12 μs,跨主机传输速度约为880 Mbit/s,满足实时系统要求。

猜你喜欢
导引头实时性线程
5G终端模拟系统随机接入过程的设计与实现
实时操作系统mbedOS 互斥量调度机制剖析
浅析体育赛事售票系统错票问题的对策研究
防空反导训练中无人机载雷达导引头作用范围研究∗
基于卡尔曼滤波器的半捷联导引头控制系统设计
动力陀螺式导引头动力学建模与分析
一种由分立导引头集成构建的复合末制导系统*
航空电子AFDX与AVB传输实时性抗干扰对比
计算机控制系统实时性的提高策略
可编程控制器的实时处理器的研究