新闻中心

EEPW首页>EDA/PCB>设计应用> 基于ARM和FPGA的靶场破片测速系统的设计

基于ARM和FPGA的靶场破片测速系统的设计

作者: 时间:2012-06-14 来源:网络 收藏

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 结语

系统综合利用了的优点,在基于+的平台上设计出系统;在架构于Linux的平台上设计了基于Qt/E的嵌入式交互程序,并且针对嵌入式设备的不足,提出Qt/E程序的优化意见和方法。系统经过试验检测,能够顺利完成靶场测速任务。系统设计结构清晰、条理严整、程序健壮,这种系统设计结构和对Qt/E程序的优化思想对同类设计具有较大的参考意义。


上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭