破片速度是战斗部爆炸效能*估的一个重要参数。传统的靶场破片测速系统多使用多路数据采集卡设置好的参数现场采集标靶的试验波形,试验完成后再交由计算机进行后期处理和解读以获取破片速度等参数。但随着军事科技的日新月异,靶场破片测速系统需要根据实际情况现场设置的参数越来越多,参数设置的灵活性越来越强,对系统工作的实时性要求越来越高;另一方面,战斗部爆炸试验在野外进行,条件恶劣,大型设备携带不便,以往的PC机+数据采集卡设计已经越来越不能满足靶场试验的要求。嵌入式系统具有功耗小、便携性好、稳定性高、实时性强的特点,近年来随着嵌入式技术的不断发展,把嵌入式技术引入靶场破片测速系统设计中,为靶场破片测速系统设计提供了一个新的思路。
本文设计的靶场破片测速系统以ARM处理器为控制核心,利用了FPGA强大的多路并行处理能力进行数据处理,在基于嵌入式Linux的平台上采用Qt/Embedded设计了友好的人机交互界面。系统功能完善,操作直观简单,携行方便,能够满足在野外进行破片测速的大多数需要。
1 系统硬件设计
系统使用ARM+FPGA的设计方式。
ARM处理器选用SAMSUNG公司推出的基于ARM920T内核的S3C2440。S3C2440主频高达400 MHz,完全能够胜任系统工作要求。S3C2440集成了SDRAM和FLASH控制器,提供了串口,触摸屏接口,USB接口等多种接口,接口丰富、功能强大,是一款高性能,低价格的处理器,在嵌入式设备中获得了广泛的应用。
FPGA(现场可编程门阵列)选用了Altera公司StratixⅡ系列的EP2S15芯片,该芯片器件密度可达到15600等效逻辑元(LE),能提供419Kb片内TriMatrix存储器,多达12个DSP区块共有48个(18×18 b)乘法器,用来实现高性能滤波器和其他DSP功能。支持多种高速外接存储器接口,支持各种标准的I/O,高速差分I/O,具有强大的高速多通道并行处理能力。
系统使用该芯片64 MB SDRAM作为系统内存,64 MBFLASH用于Linux内核、文件系统、应用程序和试验数据的存储,为系统运行提供了充足的存储空间。
系统硬件结构图如图1所示。
图1 系统硬件结构图
在图1中,系统采用了32个标靶用于破片测速,一个标靶对应FPGA的一个通道,每个通道对应一个32 b计数器。战斗部爆炸后,破片击穿标靶时产生的脉冲将作为起停信号,控制FPGA中相应通道的计数。所有通道中最早触发的通道为基准通道,相应通道计数器值为0。从基准通道被触发时刻起,除基准通道外所有通道计数器开始计数,直到本通道收到触发信号或者最长计数时间时停止计数。停止计数时的通道计数值即为本通道的触发计数值。
FPGA设置了32通道通断寄存器、32通道输入触发器、通道触发计数器等多个数据寄存器,用于保存标靶的通断、触发状态及各个通道的触发计数值;设置了最长记录时间寄存器等多个控制寄存器用于控制FPGA的动作。经过处理,FPGA将标靶的通断、触发状态及最终触发计数值写入相应数据寄存器中。
ARM处理器与FPGA通过总线方式实现通信。FPGA作为一个外部存储器挂载在ARM的存储器总线上,这样ARM处理器通过存储器指令可直接访问FPGA,从而通过读写FPGA的数据和控制寄存器实现对FPGA的控制和对数据的读取。
ARM与FPGA接口如图2所示。
图2 ARM与FPGA接口
为了便于交互,系统配置了一块5.7英寸带触摸屏的LCD显示屏作为显示控制设备,并且提供了USB口实现与主机通信。
通过试验测试,本系统能够充分发挥ARM的强大处理能力和FPGA的并行处理能力,成功达到试验目的。
2 系统软件设计
系统软件结构图如图3所示。
图3 系统软件结构图
在设计具体应用程序前首先要对操作系统进行裁减。嵌入式Linux内核,是一种完全开源、功能强大的操作系统内核,与时下流行的Wi-nce等嵌入式操作系统相比,其优点之一就在于内核的可裁减性,使用者完全能够根据自己的需要对内核进行裁减,删减去不必要的功能,完成自定义设计。本文经过裁减后的内核大小仅有1.2 MB,大大减少了对系统存储空间的占用。
GUI为用户提供了与应用系统交互的可视化通道,在嵌入式软件系统中占据重要地位。针对嵌入式设备资源有限的特点,嵌入式GUI要求提供这样一种交互接口,即它占用资源少且反应迅速,具备高度的可移植性和可裁减性。目前国内主流的嵌入式GUI系统有MINIGUI,MICRO WINDOW,Qt/Embedded等几种,各有优缺点。综合比较各种GUI系统的优劣,从GUI系统的封装性、可移植性和系统设计的便捷性考虑,最终选取Qt/Embedded进行GUI的设计。
Qt/Embedded(以下简称Qt/E)是由着名的Trolltech公司专门针对pda等嵌入式移动手持设备开发的开放源码的一套应用程序包和开发库,具有可视化强,界面美观,类库完善丰富,封装性好的优点。与其他嵌入式GUI系统相比,Qt/E开发方便,尤其是Qt/E提供了一种类型安全的基于signal和slot的真正组件化编程机制,简化了编写过程,有助于开发人员把握核心功能,使程序编写更加灵活;Qt/E程序可移植性强,具有极好的跨平台特性,完全可以“一处编写,处处编译”。许多基于计算机Qt的X Window程序在交叉编译后都可以非常方便地移植为Qt/E版本,这样完全可以在主机上完成程序开发,查看效果后经交叉编译直接在嵌入式设备上运行,大大简化了开发流程,节约了开发时间。
3 嵌入式GUI程序实现
3.1 Qt/E具体程序设计
系统在试验前需要根据现场情况进行参数设置,尤为重要的是完成标靶的分组设置:在同一方向上的两个或多个标靶分为一组,靶间距事先确定,同一破片将先后通过同组标靶,产生触发信号,控制对应通道计数器的计数起停。破片测速完成后,FPGA获得的通道触发计数值除以FPGA计数频率即为通道的触发时刻值。用同一标靶组内两个相邻标靶之间的间距除以相邻标靶之间触发时刻值的差值,即可得到破片在两个标靶之间的平均飞行速度。每个标靶组可测得一组破片穿过本标靶组时的速度值,通过进一步的计算,可获得破片的速度分布、速度降等参数。
根据系统测速过程,系统软件的工作流程如图4所示。
图4 系统软件流程图
按照系统应用要求,将GUI设计分为:参数设置模块、系统测试模块、结果查看模块和存储管理模块四个模块。参数设置模块负责对破片测速系统所需要的各种参数进行设置,主要包括标靶分组、标靶间距、标靶类型、最长计数时间。在设置过程中,GUI自动对所设置的参数进行检测,如果参数设置不正确,将产生错误提示。系统测试模块负责在试验前对整个系统进行测试。通过人为给出触发信号可在LCD上可视化的查看系统是否正常工作,通道可否正常触发,FPGA可否正常计数等。结果查看模块负责对测试结果进行显示。在试验完成,获得测试数据后,经过运算,就可以表格和分布图两种方式给出破片的触发时刻值和速度值,快速直观。存储管理模块负责系统参数及测试数据的保存和
读取,以进行试验数据的进一步分析。系统拥有脱机设置功能,即可在试验前未连接标靶的情况下,脱机进行参数设置,设置完毕后可保存所有设置参数。试验时,只要选择保存的参数就可直接载入脱机设置的参数,极大增强了系统工作的灵活性。
3.2 Qt/E程序优化
嵌入式设备的显着特点是CPU主频不高,资源有限。因为这个局限性,许多在计算机上运行流畅的Qt/E程序在嵌入式设备上反应滞后,在极端情况下甚至会出现短暂的界面冻结现象。为了提高嵌入式GUI的反应速度,对Qt/E应用程序设计就提出了更高的要求。本文在界面设计中,针对GUI运行中出现的问题,对Qt/E程序进行了一些优化,经过优化后,界面的反应速度明显改善。
3.2.1 采用静态链接代替动态链接
与静态链接相比,动态链接的优势在于动态库可被多个进程复用,从而减少了对系统内存的使用。但是动态链接的这种优越性是有代价的,由于进程在初始化时要加载并且初始化大量的动态库,当需要加载的动态库比较多或者动态库比较庞大时,直接的影响就是降低进程启动速度;另外一个影响是系统运行时因为函数的链接也要耗费一些时间。
嵌入式Qt/E程序如果使用动态链接就面临这个问题。一般来说,为了保证程序的基本功能,即使经过裁减后,Qt/E动态库也有将近10 MB大小,这些动态库在嵌入式平台上的加载将耗费大量时间。针对这个问题,一种解决方法是采用prelink预链接的方法先确定每一个动态库在内存的加载位置,从而省去动态库重定位这一过程。但是这种方法的步骤比较繁琐,使用上存在一些限定要求,在这里并不推荐。
由于本系统设计为专用系统,仅有一个GUI程序,可采取对Qt/E库静态链接的方式来提高启动和运行速度。具体过程是,在用configure配置Qt/E库编译选项时使用-static选项把Qt/E库源文件编译成静态库,在编译Qt/E程序时选择链接库为静态库。经过测试,采用静态链接的方式,由于在进程初始化时不用再去加载Qt/E的动态库,极大提高了进程的启动速度;在运行过程中,由于节省了函数链接时间,程序的运行速度有所提高;同时虽然Qt/E程序本身变得庞大,但是由于不用再安装Qt/E动态库,故占用的FLASH空间有限。
3.2.2 使用基础控件代替复合控件
加快界面反应速度最直接有效的方法就是减少界面中的控件数,这里的控件数,准确地说,指的是QWidget等基础控件的数量。在实际程序设计过程中,一个有效设计方法是对一些复合控件尽可能使用基础控件代替。Qt/E中提供了许多功能强大的复合控件,这些复合控件通常是由多个基础控件复合而成的,虽然操作方便,但是资源消耗也比较多,从而影响了整个界面的运行。以表格的绘制为例,如果表格使用复合控件QTableWidget实现,表格的每一个表项都作为一个子控件存在。每一次刷新表格都需要调用每个子控件的paintEvent()函数,子控件越多,函数调用次数相应的也越多,极大地占用了CPU时间,极端情况下甚至会由于paintEvent事件过多而堵塞事件队列,影响界面的正常运行。而如果用基础控件QWidget实现表格,只需调用一次基础控件的paintEvent()就可以在paintEvent()函数中自定义实现表格的绘制,虽然书写代码量可能会大一些,但是函数调用次数少,并且可以做到对表格每一个局部刷新区域的有效控制,避免许多无用操作,在嵌入式平台上,反应速度明显加快。
3.2.3 采用延迟刷新方法
当不可避免要用到复合控件时,如果用到的复合控件构成复杂、刷新耗时,为了尽可能降低这些复合控件对整体界面运行的影响,可借鉴双缓冲绘图的思想,用延迟刷新的方法来控制这些复合控件的刷新。
传统的双缓冲绘图是在内存中开辟一块缓冲区,将缓冲区看作一幅位图,先用背景色填充这幅位图,然后在这幅位图上绘制用户图形,最后显示这幅位图到窗口中。
由于在后台已完成了界面绘制,采用双缓冲绘图,可有效消除闪烁。参考双缓冲绘图的做法,为了解决耗时复合控件和整个界面在刷新时的矛盾,本文的思路是当界面,需要刷新时先不刷新复合控件,而是在背景上用一幅画布替代复合控件区域,当界面刷新完毕后,再进行复合控件的刷新。经过测试,这种方法特别适合于复合控件变化较小而整个界面需要刷新的情况。具体做法是在确定了耗时复合控件后,当需要刷新界面时,构造一幅画布QPixmap,利用QPixmap::grabWindow()函数在画布上绘制出该复合控件所占区域图形,由于这个函数只是对窗口像素点进行绘制,并不调用控件的paintEvent()函数,而嵌入式设备的分辨率一般不高,因而花费时间有限;对复合控件利用setUp-dateEnable(false)函数禁用复合控件刷新功能后,调用QApplieation::proeessEvent()完成界面除复合控件外所有控件的刷新绘制,并且为了消除闪烁,在父窗口的paintEvent()函数中调用QPainter::drawPixmap()函数将画布QPixmap绘制于背景的复合控件区域上。这时,就可看到界面的刷新效果。由于耗时复合控件的禁止刷新,整个刷新过程将会快速完成;最后再调用复合控件的setUpdateEnable(true)重新使能复合控件的刷新功能。更进一步的方法是,只有当耗时复合控件变化时才调用复合控件的setUpdateEnable(true)允许刷新操作,其余时刻均在背景上使用QPixmap绘制代替。采用这种方法相当于把耗时复合控件的刷新延迟,而先让界面其他控件完成刷新操作,从而快速显示界面的刷新效果。
4 结语
系统综合利用了ARM和FPGA的优点,在基于ARM+FPGA的平台上设计出靶场破片测速系统;在架构于Linux的平台上设计了基于Qt/E的嵌入式交互程序,并且针对嵌入式设备的不足,提出Qt/E程序的优化意见和方法。系统经过试验检测,能够顺利完成靶场测速任务。系统设计结构清晰、条理严整、程序健壮,这种系统设计结构和对Qt/E程序的优化思想对同类设计具有较大的参考意义。