APP下载

基于WPF的虚拟示波器设计

2018-07-12何海龙刘艳行

火控雷达技术 2018年2期
关键词:示波器缓冲区线程

张 博 李 黎 何海龙 刘艳行

(西安电子工程研究所 西安 710100)

0 引言

自20世纪80年代后期以来,PC机的性能得到极大提升,针对测试分析的通用软件的需求不断增长,使得虚拟仪器[1]应运而生。测试仪器的发展经历了,第一代模拟式测试仪器、第二代分立元件式测试仪器、第三代数字式测试仪器和第四代智能化测试仪器,虚拟测试仪器即将成为最新一代的测试仪器。借助于通用的模拟量或数字量输入输出接口,进行程序编写,并采用成熟的数学模型来实现对信号的测量、控制、变换、分析、显示、输出等功能。虚拟仪器不仅开发周期短,而且开发费用低廉。随着硬件载体的不断提升和新算法的引入,虚拟仪器相比于传统测试仪器也可以方便地更新和扩展,并具有很强的重用性和可配置性被广泛应用于各个测试领域。虚拟示波器是虚拟仪器基础平台的重要组成部分,是技术发展的必然,也是客观要求,具有重要的工程价值。

1 设计要求

虚拟仪器的功能可以在很多硬件平台下通过编程实现。PC平台因其应用广泛而且兼容性强,逐渐成为了虚拟仪器的主流平台。vxWorks和unix系统因其实时性好被广泛应用在试验环境。而Windows系统作为非实时性系统很少被用来设计高速虚拟测试仪器。本文所述虚拟示波器软件通过合理的线程运用和精密的定时器设计在PC平台Windows系统下完成了高速数据录取式示波器的设计。本文示波器软件通过串口通信对数据进行实时录取,通过PCOMM串口库的应用,达到了230400bps等常用高速串口的通信速率。并对传统示波器的各项分析功能进行了模拟实现。并通过WPF实现了美观的界面设计和流畅的图显效果。

虚拟示波器作为图显软件,针对数据曲线图的动态绘制可分为时间驱动和数据驱动两类。时间驱动绘图是指将数据与时间对应,以时间为横轴,对数据进行时间采样来描点绘图,能反应数据随时间的变化情况。数据驱动绘图(即逐帧显示)是指将数据直接和图形对应,以数据帧为横轴,对缓冲区里的每一帧数据都进行描点绘图,来实现对高精度要求产品的严格监控。本文采用逐帧显示的数据驱动绘图方式,要求录取数据的完整性和绘图的高速度,在保证串口不丢数据的同时,数据处理层必须快速即时地完成对接收数据的处理并合理地配合UI层的数据调度完成逐帧显示。

另外,本文虚拟示波器软件的动态曲线绘图方式也区别于传统时间驱动的绘图方式,是采用同示波器仪器一致的逐屏刷新显示模式,不仅可以表现更多的数据信息,而且更契合硬件工程师的仪表使用习惯。对实时数据也提供文件记录并保存,可以精确地对应每一帧的数据情况。对曲线图也可以截图保存,可以直观的保留数据信息。同时引入终端通信功能,可以通过虚拟示波器软件对被测系统发送命令,实现简单的模式控制和参数修改功能。

2 虚拟示波器软件设计

本文所述虚拟示波器软件设计主要分为三个部分:数据录取及实时指令通信,曲线图逐帧显示,数据分析保存。程序的编写在WPF开发环境下完成。

2.1 WPF开发环境

Windows呈现基础(Windows Presentation Foundation,WPF)[2]是微软新一代图形系统,运用在.NET Framework 3.0以上版本,为用户界面、2D/3D图像、文档和媒体提供了统一的描述和操作方法,同时提升了处理速度。得益于WPF强大的图形向量渲染引擎,程序开发人员可以设计出效果丰富的控件系统和灵活美观的程序应用界面。同时WPF采用DirectX引擎技术,并且支持GPU硬件加速,相比于传统的GDI+/GDI图形系统在性能上得到了极大提升。

传统偏重于利用CPU来进行数据与图形处理的技术,由于占用过多CPU资源,影响CPU的运算速度。但是随着现代计算机显卡等显示技术的不断提升。WPF技术充分利用计算机的显卡功能,让出了更多的CPU空间来进行数据处理,这样大大提升了CPU运算速度,保证了软件运行的流程与处理速度。

WPF使用XAML语言作为界面结构语言,后台使用C#高级语言,拥有多种编程模式,适用于多种数据访问接口,方便与第三方软件集成。

2.2 数据录取

虚拟示波器软件的串口端口,可以使用.NET基本类,System.IO.ports命令空间中的SerialPort类来实现。SerialPort类是在C#里被很好封装的串口类,波特率上限115200bps,适合试验室使用。也可以使用成熟的工业级串口工具PComm Lite。配合Moxa模块波特率上限可达921600bps,并且在多串口模式下也可以高速稳定的工作。具体使用可下载并引用pcomm.dll并编写接口类可以在WPF下,使用PComm Lite内的串口函数,完成对串口缓冲区数据的合理规划和高效管理。

PingPong缓冲机制[3]是一种数据缓存手段,通过PingPong操作可以提高数据传输效率。在两个功能模块顺序地处理数据时,如果上一级功能模块所产生的新数据不能马上被下一级功能模块处理完成而消费掉,为了保证每帧数据都被处理,上一级就必须等待下一级完成数据消费才可以产生并发送新的数据。然而在串口通信中,为了保证高速的数据率,上一级的数据产生不会等待下一级复杂的数据处理以及耗时的UI更新,这样就会严重影响虚拟示波器软件的数据录取性能,导致数据丢失现象发生,无法保证对待测设备完整精确的监控。使用PingPong缓冲机制可以不去等待下一级处理结束,而是先将上一级产生的未处理数据存在Ping路的缓冲区中,等存满后通知下一级开始对Ping缓冲区进行消费。在Ping缓冲区被消费期间,上一级产生的未处理数据转到Pong缓冲区存放,当Pong缓冲区存满时,Ping缓冲区已经被消费完成并准备好保存新数据了,此时下一级切换到Pong缓冲区消耗,而Ping缓冲区再打开并开始存储。这种双缓冲机制,可以使上级数据不间断地产生,并且都能得到处理,从而提高了处理效率,保证了在高速串口通信情况下,虚拟示波器软件也依然保持优秀的数据采集完整性。

2.3 高精度定时器实现

在大多数情况下,传统示波器仪表只是单方面的信号采样。对于工作在不同工作模式下的信号源,一般可以外部切换好了之后再连接示波器进行监测。然而作为本身就占有一个串口的虚拟示波器,如果再通过通过外部改变待测设备的工作状态,会产生很多不便。于是在实际工作情况下,本文所述虚拟示波器软件可以同时通过串口和被测硬件通信,控制待测工作模式的切换,并通过配置文件的修改实现通信协议的灵活切换。

本文所述虚拟示波器软件被用于DSP信号的监测,要求软件5 ms为周期不间断发送工作模式命令和参考信号才能实现对DSP不同工作模式的切换监测。这对以Windows为平台的虚拟示波器软件设计是一个难点。NET Framework支持四种定时器,然而精密度都不准(最低只能达到15 ms),无法满足高速设计要求。Windows不是实时操作系统,所以在不涉及内核驱动层面的条件下,想要实现高精密定时器,需要使用等待机制和计时工具两种基础功能。这里不讨论多媒体定时器[4]的原因,是在WPF下的多媒体定时器依托事件机制,而在多线程应用中,事件由于低的优先级,经常会受到干扰,影响定时器精度。

等待机制有两种分为自旋等待和阻塞等待。自旋等待就是让CPU以空转的方式来完成时间消耗,虽然使用了较多CPU时间,但是时间的精度高。阻塞等待就是所处线程阻塞,在等待规定时间后再由操作系统控制返回运行状态。虽然阻塞不占CPU,但是需要操作系统控制执行,时间无法控制。

计时机制在WPF下最适合的就是Stopwatch类。精度取决于硬件的主频,精度可以高达几十ns。

本文虚拟示波器软件使用自旋等待机制配合Stopwatch计时,实现了高精度的定时器,伪代码如下:

var计时开始时刻 = 目前时刻;

while((目前时刻-计时开始时刻)<规定延迟时长)

{

自旋;

}

改成实际代码如下:

void Spin(Stopwatch timer, int duration )

{

var current = timer.ElapsedMilliseconds;

while ((timer.ElapsedMilliseconds - current) < duration)

Thread.SpinWait(10);

}

这里timer是Stopwatch类的一个对象,其中ElapsedMilliseconds属性可以实现毫秒级的精度,而ElapsedTicks属性可以实现高达微秒级的时间精度。运用高优先级的线程[5]单独运行这种定时器可以保证在微秒级的定时精度下,稳定触发指定任务,保证本文虚拟示波器软件达到了200Hz稳定可靠的数据率。

2.4 多线程数据处理

虚拟示波器软件在确保录取数据完整的同时,还应该确保数据曲线图显示的完整性。如果程序只有一个线程在运行,当程序进行数据接收并处理与曲线图逐帧显示的这段时间内,无法处理数据命令发送,使得下位机返回数据丢失,也有很大的概率造成整个界面卡死。因此为了提升程序效率,使程序能够同时处理多种并行功能,不可避免地要引入多线程技术[6]。

线程是操作系统分派CPU时间的基本单元。每个线程所分派的CPU时间片很小,程序是对时间片的轮转访问来运行的。其实多线程是异步运行的。在避免线程之间数据竞争的前提下,本文虚拟示波器软件分别为串口通信任务和曲线绘制任务开辟线程。使得多条任务线程同时运行,显著提高了系统性能。

本文pingpong缓存机制也保证了线程之间没有同时调取的数据,不会发生数据竞争。同时使用WaitOneEevent来分时触发并行任务,进一步保证了程序的线程安全。本文软件中的线程框图如图1所示:

图1 软件多线程框图

2.5 图表绘制

示波器被誉为“工程师的眼睛”。最初是通过狭窄并且高速的电子束,打在荧光平面上通过描绘待测电信号瞬时值变化曲线,来描述电现象的变化过程的。其经典的扫描式显示模式一直深入人心,也成为工程师的仪表使用习惯。本文虚拟示波器软件模拟了这一经典显图风格。

人类视觉系统(HVS)对时间频率的反应时间是,在普通亮度环境下,图像帧的变化频率应该在15 Hz到20 Hz之间。平衡显示图像的帧速率一般为22fps到30fps之间。然而本虚拟示波器软件采用数据驱动绘图方式,每屏应尽量容纳更多的数据信息,也就使得最终图像画布上承载上千个数据点的信息。要一次性连接千个数据点并形成曲线,如果点与点之间变化很大,就相当于WPF要通过PolyLine在画布上大范围地扫来扫去,这样会每帧产生上百万个像素点。即使WPF有着硬件加速,但是要完成这样的任务还是非常耗时的,无法保证曲线平滑的显示。为了满足25fps的帧速率,需要每40ms更新一次图像。考虑到本文应用场景是200 Hz的数据率,所以每次只能对8个点进行更新显示。因此可以把PolyLine的思路换成上千个成员的Line数组添加到画布上,每次只在8个需要更新的数据点处进行连接直线的删除和新建这样的更新操作,而其他的位置不变,就可以在40ms的周期内完成每帧数据的更新。接着再模仿示波器扫描图显模式,横扫的方式确定需要更新的那8个点的位置进行替换,这样就可以在保证平滑显示的前提下完成对示波器扫描图形显示模式的模拟。而且这种绘图方式也可以同时进行多通道数据的多曲线绘图显示。

3 结束语

本文使用虚拟示波器软件与串口数据率200 Hz的DSP待测硬件进行了模式信号监测和指令交互式信号监测。从实验结果上看,完全满足设计要求。CPU使用率和内存使用率等性能指标也符合要求。

本文虚拟示波器界面如图2所示:

图2 虚拟示波器界面图

猜你喜欢

示波器缓冲区线程
5G终端模拟系统随机接入过程的设计与实现
实时操作系统mbedOS 互斥量调度机制剖析
浅析体育赛事售票系统错票问题的对策研究
好马配好鞍,洞察靠真探
高档宽带示波器的发展近况
缓冲区溢出漏洞攻击及其对策探析
SS—5702示波器扫描电路分析与故障排除方法
初涉缓冲区
本期导读
Linux系统下缓冲区溢出漏洞攻击的防范