微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于嵌入式技术的靶场破片测速系统设计

基于嵌入式技术的靶场破片测速系统设计

时间:02-21 来源:互联网 点击:

3 嵌入式GUI程序实现
3.1 Qt/E具体程序设计
系统在试验前需要根据现场情况进行参数设置,尤为重要的是完成标靶的分组设置:在同一方向上的两个或多个标靶分为一组,靶间距事先确定,同一破片将先后通过同组标靶,产生触发信号,控制对应通道计数器的计数起停。破片测速完成后,FPGA获得的通道触发计数值除以FPGA计数频率即为通道的触发时刻值。用同一标靶组内两个相邻标靶之间的间距除以相邻标靶之间触发时刻值的差值,即可得到破片在两个标靶之间的平均飞行速度。每个标靶组可测得一组破片穿过本标靶组时的速度值,通过进一步的计算,可获得破片的速度分布、速度降等参数。
根据系统测速过程,系统软件的工作流程如图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绘制代替。采用这种方法相当于把耗时复合控件的刷新延迟,而先让界面其他控件完成刷新操作,从而快速显示界面的刷新效果。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top