采用MiniGUI双缓冲技术和AT91SAM9263实现数字加密电话系统的设计

引言
在需要丰富人机交互信息的嵌入式系统应用中,高精度的动态图像显示非常重要。因此,嵌入式系统对gui的实时性和稳定性的要求也越来越明显。但是,动态图像的抖动和刷新延迟的问题在嵌入式系统中经常出现,影响系统的显示效果。
国产图形用户界面系统minigui提供完备的多窗口机制和类win32消息传递机制,便于实现多个进程间的消息传递。而且具有占用内存少、可移植性好等特点,因此在嵌入式领域中被广泛应用。但在实际应用中,发现了两个问题:一是用minigui的animation控件实现时出现动画抖动,二是显示较多图片的窗口刷新时屏幕闪烁,严重影响屏幕的显示效果。为解决以上两个问题,本系统采用minigui的双缓冲技术和多张图片交替显示的方法,并通过实际应用证明了该方法的有效性。
1、 数字加密电话系统架构
1.1 硬件系统
数字加密电话硬件系统的芯片采用atmel公司的at91sam9263处理器。主频为200 mhz,2 mb高速data flash、64 mb nand flash和64 mb sdram。核心板的对外接口包括键盘接口、lcd接口、led接口、modem模块、电话机模块和接口、sd卡接口和usb主从接口等。如图1所示。
1.2 软件系统
操作系统:开放源码的linux操作系统是开发嵌入式产品的首选。本系统采用开放源码的嵌入式linux系统。它的内核版本为2.6.22,是基于default_at91sam9263_config配置的。
交叉编译工具链:采用arm-linux-xxx。arm-linux-gcc用于交叉编译源程序,生成执行文件;arm-linux-strip用于去掉执行文件中的调试信息,起到减小执行文件大小的作用。
gui系统:minigui是国产的一款面向嵌入式系统、跨操作系统的轻量级国产高级窗口系统(windowing system)和图形用户界面(graphi-cal user interface,gui)支持系统。经过10余年的发展,minigui已经发展成为比较成熟、性能优良且功能丰富的跨操作系统的嵌入式图形界面支持系统。minigui可在linux/μclinux、ecos、μc/os-ii、vxworks、psos、threadx等操作系统以及win32平台上运行,已广泛应用于手持信息终端、机顶盒、工业控制系统、便携式多媒体播放器等产品中。
minigui支持bmp、gif、png、jpeg、pcx、tga等常见图像文件和位图、图标、光标等windows资源文件,支持多字符集和多种字体,库文件较小且可配置。minigui3.0比其之前的版本,在以下几方面有新的发展:
①主窗口双缓冲技术,可以在自定义缓冲区中获得整个窗口的渲染结果。
②外观渲染器技术,外观渲染器提供了多种风格的主窗口和控件界面外观,并且应用程序可在几种风格之间动态切换。
③双向文本显示与输入,增加了对阿拉伯文和希伯来文语言的支持,实现了文本的变形和重排,并提供了阿拉伯文和希伯来文键盘的支持。
④支持不规则窗口,如圆角矩形、非矩形窗口等。
⑤增加了组件mgutilis,该组件为用户提供了一些常用的对话框模板,便于代码复用。
⑥增加了组件msgplus,该组件是对minigui图形绘制接口的一个扩充和增强,主要提供对二维矢量图形和高级图形算法的支持。
因此,minigui非常适合编写嵌入式图形用户界面应用程序。
1.3 用户界面设计
数字加密电话系统需要显示当前的系统状态和具体内容,以此进行系统与用户之间的信息交流,因此对界面的稳定性和实时性要求较高。本系统将整个屏幕分为3个区域,即状态区域、logo与时间显示区域和主显示区域,如图2所示。状态显示区主要表示当前系统的工作状
态和设备的状态。比如是挂机态还是摘机态,是加密还是非加密态,是否插入u盘,当前的数据传输率为多少等。不同的状态需要用不同的图片来显示。从一个状态过渡到另一个状态,需要用一个动画来表示。主显示区域主要显示表示当前系统的工作情况的动画或文字提示。比如表示普通语音电话的动画、表示正在加密传输的动画,也可以显示其他信息,如系统功能选择界面、选文件界面、日志管理界面等。logo及时间显示区显示公司的logo与当前系统时间。对于本系统的界面设计来说,最重要的是各种动画的显示要流畅。
2 、实现gui时存在的两个问题
本系统gui的实现问题主要是各种图片的显示、动画和选择功能界面的实现。图片的显示方法很简单,因此,在下面只介绍动画和选择功能界面的实现方法及存在的问题。
2.1 动画的实现方法及存在的问题
minigui为实现动画,已提供了animation控件,用animation控件实现动画的过程非常简单:
①准备动画文件,文件格式应该是gif格式,gif格式的动画文件可以用flash和photoshop生成。
②用函数createanimationfromgif89afile()读入gif文件。
③用createwindow()创建动画显示窗口。
④用sendmessage()函数控制动画,该函数的第2个参数为anm_startplay表示启动动画,参数为anm_playstop表示暂停动画。也可以用函数sendmessage(getdlgitem(hinitface,idc_mainanimation),anm_setanimation,0,(lparam)anim)实现更换动画文件。但是,在嵌入式环境下,使用该方法播放动画时,在状态显示区和主显示区内都产生严重的抖动现象。而且屏幕越大抖动就越明显,分辨率为480×640时的抖动现象比240×320时更明显。减少动画的帧数或延长每一帧的播放时间,抖动仍然存在,严重影响屏幕的显示效果。
2.2 功能选择界面的实现及存在的问题
功能选择界面一般由多个图片来组成,各表示不同的系统功能,用上下左右键选择不同的功能,按enter键运行相应程序,即打开另一个窗口,完成相应功能。当关闭窗口时重新显示功能显示界面。为区别被选中功能和未选中功能,放大或下沉显示当前被选中的功能图片,而前一个被选中功能图片恢复成原来的大小,如图3所示。每次用上下左右键选择功能时和关闭功能窗口时,都要重新刷新背景,并重绘窗口客户区的各个图片。因为minigui不保存被覆盖区域的内容,因此在msg_paint消息中需要重绘的内容较多,重绘图片的常用方法是用fillb-oxwithbitmap()函数填充相应图片区域,但是这种方法加重了屏幕刷新负载,引起屏幕明显地闪烁。
3、 关键问题的解决方法
3.1 动画抖动问题的解决
产生动画抖动的主要原因是,用animation控件实现动画时,频繁地产生msg_paint消息,加重了屏幕刷新的请求。minigui通过判断窗口是否含有无效区域来确定是否需要重绘窗口。如果需要重绘就向应用程序发送msg_paint消息。窗口的重绘任务需由应用程序自己完成,因为minigui不保存被覆盖区域的内容。minigui的窗口在响应msg_paint消息的时候进行复杂的图形处理,尤其是在刷新时,对图像的擦除和重写造成了图像颜色的反差。当绘图消息的响应很频繁时,这种反差也就越发明显,于是我们就看到了动画抖动的现象。为了解决动画抖动的问题,系统采用了双缓冲技术和多个图片交替显示的方法。并在实际应用中证明了该方法是行之有效的。双缓冲技术要比直接操作显存速度更快,因此可以解决抖动现象。
采用双缓冲技术实现动画的基本思路是这样的,首先在系统内存中建立一个类似显示内存的内存设备上行文,然后将待显示图片填充到该内存设备上行文中,最后再通过位拷贝方式复制到显示内存中。为了达到动画的效果,将多个图片循环显示,即设定定时器和静态变量,每当定时器触发时,根据静态变量的值显示不同的图片,静态变量由0到max循环。实现动画的详细流程如图4所示。定时器的时间间隔和图片的数量可以根据具体情况任意调整。本系统的主显示区动画采用这种方法实现后,动画效果流畅,不再有抖动现象。
3.2 功能选择界面闪烁问题的解决
功能选择界面闪烁的主要原因是屏幕内容过多,刷新负载过大。本系统采用双缓冲技术和minigui.cfg配置文件的设置方法,实现只刷新屏幕的局部,解决了功能选择界面闪烁问题。每次按上下左右键或关闭功能窗口时,用以下3个步骤实现重绘屏幕无效区域(以图3为例)。
①a区用小图标恢复,用函数stretchblt(hdcmem,0,0,0,0,hdc,win_left,win_top,width,hight,(dword)0)实现,其中hdcmem是内存设备上下文,是用createcompatibledcex()函数创建的。该内存设备上行文中已经存有图3下图中的a区域信息(第一次是在窗口的msg_ create消息中保存的,第二次开始是在第二步骤保存的)。
②将b的图片区域(小图片)复制到内存设备上下文,用函数stretchblt(hdc,win_left,win_top,width,hight,hdcmem,0,0,0,0,(dword)0)实现。
③b区域的图片放大显示,通过函数fillboxwithbitmap(hdc,win_left,win_top,width,hight,deskimage,&bitmap)实现。
其中,win_left、win_top、width和hight分别表示图片放大显示区域的左、上坐标和宽、高。左、上坐标的定位公式如下:
win_left=水平基准坐标+(i%deskcols)×(bltwidth+水平间隔)
win_top=垂直基准坐标+(i/deskcols)×(blthight+垂直间隔)
式中,i表示第几个图片,deskcols表示每一行的图片个数,bltwidth和blthight各表示图片区域的宽和高。为了减少屏幕刷新负载,不在msg_paint消息中刷新背景,而是用minigui.cfg配置文件中的bgpicture参数指定背景图,并在指定的目录中存放背景图文件。该参数在minigui的4种渲染器中都有,即在不同的渲染器中,都可以用该方法,无需用代码去实现背景图的刷新。
4、结语
本文详细地描述了基于minigui的嵌入式系统用户界面关键问题的解决方案,即无抖动动画的实现方案和功能选择界面闪烁问题的解决方案。当需要实现动画,而且动画文件较大时,可以采用双缓冲技术解决动画抖动的问题。但是双缓冲技术需要额外的内存设备上下文,所以简单的动画效果可以用sendmessage(窗口句柄,stm_setimage,pngmap,0)函数更换图片的方式实现较好。


IBM结盟群环力推PowerAI深度学习架构 助企业体验认知商机
涡轮喷气发动机的工作原理
西门子博途如何联机访问CPU?
Galaxy Watch5系列搭载Melexis温度传感器芯片
为什么人类不相信机器人呢?
采用MiniGUI双缓冲技术和AT91SAM9263实现数字加密电话系统的设计
改变我们生活的锂离子电池 | 第二讲:锂离子电池的优点和充电时的注意事项
韩国与智利加强锂产业合作,促进清洁能源供应链多元化
误码率的官方定义,怎么得到误码率指标呢?
uart串口通信介绍
全国产化核心板!金其利将“自主可控”进行到底
2023数博会“数据要素流通与价值化”论坛在贵阳成功召开
SanDisk发布新款SSD及其报价
魅蓝S6拆解评测:吃鸡趁热 拆机更要趁热
组成数字系统的基础逻辑器件
Python调用OpenCV实现图像腐蚀案例
韩科学家研发智能皮肤:可感知温度
骁龙本是怎样解决工作的难题的
5G给云计算和边缘计算协同发展带来广阔空间
什么是IMU传感器 IMU传感器在自动驾驶汽车的关键应用