1、引言
近年来,随着信息家电、手持设备、无线设备的迅速发展,人们对嵌入式系统的需求逐渐增多,要求也越来越高。这使为嵌入式系统提供一个友好方便、稳定可靠的G UI系统成为非常紧迫要求[5]。嵌入式技术是当前微电子与计算机技术中的一个重要分支[1], 它是指以应用为中心, 以计算机技术为基础,软件、硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等的严格要求的专用计算机系统[2]。常用的PC机上的GU I因嵌入式设备对资源的严格要求显得过于庞大,而不适合嵌入式系统[6]。与普通环境下的GUI 系统相比较.嵌入式环境下的GUI 系统要求轻型、占用资源少、高性能、高可靠性、可配置等。同时,由于嵌入式环境的多样性,跨平台、高移植性也是嵌入式GUI系统必须具备的特点。
尽管嵌入式系统对GUI 的需求越来越明显,但目前GUI的实现方法各有不同,主要有二种; 第一种方法是某些大型厂商针对自身需要自主开发满足自身需要的GUI 系统;第二种方法是某些厂商使用某些比较成熟的GUI系统。对于大部分厂商来说,第二种方法不失为一个省时省力、又可取得较好效果的方法。
2 GUI 系统发展概况
目前国内外已经推出了很多基于Linux的GUI产品, 比较成熟的面向嵌入式的GUI 系统有QtEmbedded 、MicroWindows 、MiniGUI 、WinCE 等[4]。
1)Microwindows 是一个公开源码(LGPL)的项目。它致力于为一些小型的设备和平台提供现代图形窗口环境的一些特性,其主要特色是一个基于客户/服务器体系结构的GUI 系统,采用了面向硬功件的驱动程序层、对硬件的接口层、向高层操作系统的API 层的三层体系结构。并提供了相对完善的图形功能, 以及一些其他较高级的功能,比如Alpha 混合、三维支持、TrueType 字体支持等。但是有如下缺点:无任何硬件加速能力,图形引擎中存在许多低效算法,且代码质量较差。
2)MiniGUI是在Linux 控制台上运行的,基于SVGALib 和LinuxThread 库的多窗口图形用户界面支持系统。主要特色是基于线程来编写,所有的应用研究程序都运行在同一个地址空间,这样可以提高系统的效率。底层增加了图形抽象层GAL 和基于输入设备的输入抽象层作为提供底层Linux 控制台或者XWindow 上的图形接口以及输入接口。但是API没有封装,不便移植,功能限制其不能用于更大的嵌入式系统。
3)Qt/Embedded 是著名的Qt库开发商Trolltech 公司开发的,是一个专门为嵌入式系统设计的图形用户界面工具包。它的主要特点是可移植到不同平台上、拥有自己的窗口系统、拥有自己强大的开发工具和编程接口、提供压缩字体格式、支持Unicode, 可以轻松地使程序支持多种语言。但是Qt/Embedded 不是免费的,使用者必须支持license 费用。
4)OpenGL 采用LGPL 条款发布。OpenGUI 比较适合于基于x86 平台的实时系统,基于汇编实现的内核,并利用MMX 指令进行了优化使其运行速度快,但可移植性稍差。
这几种GUI 的设计目标仍然是通用性,它们大多支持多窗口的随意切换、覆盖,以及可移动、可动态改变尺寸的窗口,诸如此类在多数嵌入式应用中几乎永远用不到的特性,使得应用程序的开发要考虑很多不必要的细节[5]。
以上的嵌入式GUI 系统已很成熟,但是对于一些需求自主开发轻型、功能简洁、专用性强GUI 系统的用户来说,以上的产品并不是一个很好的选择。以上的GUI 系统一部分是收费的商业产品,另外是通用的GUI功能系统,对硬件资源非常看重的嵌入式系统来说,多余无用的功能浪费硬件资源绝不是好的选择。本文针对开发小型专用的嵌入式GUI 系统进行了研究,实现专用的GUI 系统的开发。
3 轻量级GUI 的设计与实现嵌入式GUI 系统采取分层设计的结构,对不同层次进行封装。在最低层建立了硬件抽象层(HAL,Hard Abstract Layer),为基于图形显示设备(如VGA 卡)的图形抽象层(Graphic Abstract Layer,GAL)和基于输入设备(如键盘、触摸屏等)的输入抽象层(Input Abstract Layer,IAL) 。图形抽象层GAL 建立在各种流行的绘图引擎之上,屏蔽各种绘图引擎的具体实现,对上层提供统一的底层绘图接口。输入抽象层IAL建立在各硬件设备驱动程序之上,屏蔽各种不同的输入设备硬件实现,对上层提供统一的应用输入接口;图形引擎通过FrameBuffer 来获得,而输入设备的处理却没有统一的接口。在PC上,通常使用键盘和鼠标,而在嵌入式系统上, 可能只有触摸屏或为数不多的几个键,在这种情况下,提供一个抽象输入层就显得格外重要。图形设备接口(GDI,Ggraphic Device Interface) 建立在图形抽象层之上,主要包括点、线、面、文本、的绘制等功能。图形用户接口及相关API则建立在图形设备接口之上,实现消息队列、窗口、控件以及应用程序管理等各种功能。系统的层次结构如图1所示。
3.1 嵌入式LIGHT GUI系统层次结构
GAL 层完成系统对具体的显示硬件设备的操作, 极大程度上隐藏各种不同硬件的技术实现细节,为应用程序开发人员提供统一的图形编程接口。IAL 层则需要实现对于各类不同输入设备的控制操作,提供统一的调用接口。GAL 层与IAL 层的设计屏蔽了底层硬件的多样性,可以极大程度地提高嵌入式GUI 的可移植性。另外利用GAL 可大大提高GUI 的可移植性,并且使程序的开发和扩展变得更加容易。图形抽象层使用GFX 数据结构来表示图形引擎系统;系统通过输入设备层将底层的各种设备统一映射成上层应用程序支持的两种基本输入设备——鼠标设备和键盘设备。对于具体的硬件设备,只要根据驱动程序提供的接口,编写程序实现相应的抽象接口,就能将各种设备模拟成为鼠标或者键盘进行输入。
系统通过维护一个已注册图形引擎数组,保存每个图形引擎数据结构的指针。系统利用一个指针保存当前使用的图形引擎。每个图形引擎的数据结构定义了该图形引擎的一些信息,实现GAL 所定义的各个接口,包括初始化和终止、画点处理函数、画线处理函数、矩形框填充函数、调色板函数等。
3.2 图形设备接口(GDI) 图形设备接口是建立在图形抽象层上的一个独立的绘图应用接口,它将图形抽象层提供的接口功能进一步封装和扩充,向更高层的应用程序提供使用更为简便,功能完善的绘图功能。lightGUI 采用了Windows 类似于Windows 中的GDI 模块。它提供设备上下文(Device Context) 操作、基本GDI 对象操作(包括画笔、画刷、字体、位图、区域等)。在该系统中,设备上下文的定义采用如下数据结构:typedef struct gdi_DC{ int DrawPointx; int DrawPointy; int DrawOrgx; int DrawOrgy; int DrawRangx; int DrawRangy; int DrawRop; COLORREF BackColor;
COLORREF FontColor;
}DC,*PDC
系统中设置和设备上下文主要的API 如表所示
CreateDC(): 创建新的设备上下文
DispatchDC(PDC):释放设备上下文
GetDrawDes (PDC,POINT*): 获取设备上下绘图坐标原点
GetDrawRange(PDC,POINT*):获取上下文绘图坐标范围
GetBackColor(PDC,int* ):获取上下文绘图背景色
3.3 消息驱动机制的设计实现系统的基本通信机制是事件驱动消息机制。系统线程与系统中所有的窗口拥有自己的消息队列。系统线程,该队列中存放所有从底层输入设备接收到的各类控制消息,等待系统线程分配到应用程序窗口;系统中所有的窗口私有消息队列用来存放发送到该窗口的所有消息,等待窗口进一步处理。在系统中消息分为四类:系统消息、外部时间消息、窗口菜单消息、窗口控件消息。在消息驱动的应用程序中,外设发生的事件(例如键的敲击)都由支持系统收集,将其以事先约定格式翻译为特定的消息。应用程序一般包含有自己的消息队列,系统将消息发送到应用程序的消息队列中。应用程序可以建立一个循环,在这个循环中读取消息并处理消息,直到特定的消息传来为止。当窗口没有消息可处理时,消息循环处理阻塞状态,这时不消耗CPU 资源。在GUI 中应用程序处理消息队列中的消息分为GetMessage()从消息队列中获取消息。GetMe
ssage()函数有2个参数,一个用来存放接收到的消息数据,另一个是应用程序主窗口句柄。当获得一个消息时,会将该消息的目标窗口确认为应用程序主窗口。如果收到的消息不是MSG_QUIT
3.4 窗口的设计实现窗口管理模块支持多窗口的同时显示,可进行窗口的创建、移动、大小调整等操作。窗口设计中包括主窗口、窗口菜单、窗口控件、窗口主过程和窗口相关的API函数。在设计中对每个窗口都采用自身的主过程来完成自身消息的处理工作3.5 控件层(Controls) 控件层是窗口的子窗口。这些子窗口的行为与主窗口一样,既能够接收键盘和鼠标等外部输入,也可以在自己的区域内进行输出,只是其所有活动被限制在主窗口中。控件层设计实现了基本控件,包括按钮、静态文本框、单选(多选)框、绘图框等多种通用控件。控件层充分挖掘了基本窗口系统的潜力。向用户提供最常用的功能,极大地简化用户开发的过程。
4 结束语
本文介绍了嵌入式图形用户界面系统的基本架构和实现原理,提出了嵌入式环境下自主、轻型、占用资源少可配置的GUI 系统的解决方案。轻量级 GUI 系统已在Linux 系统上测试通过。本文所开发所采用的体系结构以及面向对技术对窗口用户控件的开发极大的提高了开发效率和代码的重用率,对开发自主的GUI 系统有一定的借鉴和参考价值。本文作者创新点:利用Linu x开发平台,研发适用于小型嵌入式系统的专用GUI系统,使用层次结构和面向对象的控件开发技术,缩短开发周期,降低开发成本,为嵌入式GUI系统的开发提供结开发方法的参考。