1、导言
近年来,跟着信息家电、手持设备、无线设备的迅速开展,人们对嵌入式体系的需求逐步增多,要求也越来越高。这使为嵌入式体系供给一个友爱便利、安稳牢靠的G UI体系成为十分急迫要求 。嵌入式技能是当时微电子与计算机技能中的一个重要分支 , 它是指以运用为中心, 以计算机技能为根底,软件、硬件可裁剪,习惯运用体系对功用、牢靠性、本钱、体积、功耗等的严格要求的专用计算机体系 。常用的PC机上的GU I因嵌入式设备对资源的严格要求显得过于巨大,而不适合嵌入式体系 。与一般环境下的GUI 体系相比较.嵌入式环境下的GUI 体系要求轻型、占用资源少、高性能、高牢靠性、可装备等。一起,因为嵌入式环境的多样性,跨渠道、高移植性也是嵌入式GUI体系有必要具有的特征。
虽然嵌入式体系对GUI 的需求越来越显着,但现在GUI的完结办法各有不同,首要有二种; 榜首种办法是某些大型厂商针对本身需求自主开发满意本身需求的GUI 体系;第二种办法是某些厂商运用某些比较老练的GUI体系。关于大部分厂商来说,第二种办法不失为一个省时省力、又可取得较好作用的办法。
2 GUI 体系开展概略
现在国内外现已推出了许多依据Linux的GUI产品, 比较老练的面向嵌入式的GUI 体系有QtEmbedded 、MicroWindows 、MiniGUI 、WinCE 等。
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 的规划方针仍然是通用性,它们大多支撑多窗口的随意切换、掩盖,以及可移动、可动态改动尺度的窗口,诸如此类在大都嵌入式运用中简直永久用不到的特性,使得运用程序的开发要考虑许多不必要的细节。
以上的嵌入式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所示。
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体系的开发供给结开发办法的参阅。