摘要:MiniGUI作为一种嵌入式的图形用户界面,适合于作为嵌入式应用软件的显示引擎。分析了MiniGUI的结构和特点,并在配置和编译好uClinux后,提出一种将MiniGUI移植到目标平台上的方案。 1 引言 嵌入式系统是当今一个非常重要的发展方向,嵌入式的广泛应用已经无所不在,手机、电话座机、PDA、数字机顶盒等都有嵌入式系统的存在。而用于嵌入式系统的图形用户界面(GUI)也随之广泛流行,它极大地方便了非专业用户的使用。MiniGUI最初是为了满足一个工业控制系统(计算机数控系统)的需要而设计和开发的。考虑到X Window不适合于实时控制系统并且其本地化也不尽人意,因此MiniGUI一开始就针对实时系统而设计,考虑了实时系统对GUI的占用资源少、高性能、高可靠性及可配置的基本要求。MiniGUI目前的功能己经非常强大,并且已经成功应用于许多嵌入式系统中。 2 MiniGUI的特点和体系结构 2.1 MiniGUI的特点 目前,在嵌入式系统中比较常用的有如下几种GUI系统:紧缩的X Window系统、MiniGUI、MicroWindows、OpenGUI及QT/Embedded 等,而MiniGUI作为一个面向实时系统的GUI,具有其自身的特点: - 提供了完备的多窗口机制和消息传递机制。
- 提供常用的控件类,包括静态文本框、按钮、单行和多行编辑框、列表框、组合框、进度条、属性页、工具栏、拖动条、树型控件、月历控件等。
- 对话框和消息框支持。
- 其他GUI元素,包括菜单、加速键、插入符、定时器等。
- 界面皮肤支持。用户可以通过皮肤支持外观非常华丽的图形界面。
- 通过两种不同的内部软件结构支持低端显示设备(如单色LCD)和高端显示设备(如彩色显示器),后者在前者的基础上提供了强大的图形功能。
- Windows的资源文件支持,如位图、图标、光标等。
- 各种流行图像文件的支持,包括JPEG、GIF、PNG、TGA、BMP等等。
- 多字符集和多字体支持,目前支持ISO8859-1-ISO8859-15、GB2312、GBK、GB18030、BIG5、EUC-jp、Shift-JIS、EUC-KR、UNICODE等字符集,支持等宽点阵字体、变宽点阵字体、Qt/Embedded使用的嵌入式字体QPF、TrueType以及Adobe Typel等矢量字体。
- 汉字(GB2312)输入法支持,包括内码、全拼、智能拼音、五笔及自然码等。
- 针对嵌入式系统的特殊支持,包括一般性的I/O流操作,字节序相关函数等。
2.2 MiniGUI的体系结构 MiniGUI是分层设计的,其结构如图1所示: 中间层是MiniGUI的核心层,上层为它的API,在底层,图形抽象层GAL和输入抽象层IAL提供底层图形接口以及输入接口,而Pthread是用于提供内核级线程支持的c函数库。 利用GAL和IAL,MiniGUI可以在许多图形引擎上运行,可以非常方便地将MiniGUI移植到其他POSIX系统上,而这只需要根据我们的抽象层接口实现新的图形引擎即可;并且也可提高MiniGUI的可移植性,使程序的开发和调试变得更加容易。可以在一般的Linux系统上开发和调试自己的MiniGUI程序,通过重新编译就可以让MiniGUI应用程序运行在特殊的嵌入式硬件平台上。 针对不同的操作系统环境,MiniGUI可以被配置成三种运行模式: - MiniGUI-Threads。运行在MiniGUI-Threads上的程序可以在不同的线程中建立多个窗口,但所有的窗口在一个进程或者地址空间运行。这种运行模式非常适合于大多数传统意义上的嵌入式操作系统,比如uc/OS-II、VxWorks、pSOS等。当然,在Linux和uClinux上,MiniGUI也能以
MiniGUI-Threads的模式运行。 - MiniGUI-Lite。和MiniGUI-Threads相反,MiniGUI-Lite上的每个程序是单独的进程,每个进程也可以建立多个窗口。MiniGUI-Lite适合于具有完整UNIX特性的嵌入式操作系统,比如嵌入式Linux。
- MiniGUI-Standalone。在这种运行模式下,MiniGUI可以以独立的方式运行,既不需要多线程也不需要多进程的支持,这种运行模式适合功能单一的应用场合。比如在一些使用uClinux的嵌入式产品中,因为各种原因而缺少线程的支持,这时,就可以使用MiniGUI-Standalone来开发应用软件。
3 uClinux的配置和编译 本方案是在Embest EduKit-II实验平台上实现的,CPU为S3C44BOX芯片,宿主机编译环境为RedHat9.0操作系统。uClinux采用uClinux-dist-20040408,首先运行make xconfig进行配置,需要设置的选项有(如图2所示):在Vendor/Product Selection中选择相应的目标平台Embest,在Kernel/Library/Defaults Selection中,Kernel选为Linux-2.4.x,libc选uClibc,然后选择Customize Kernel Settings为Y进行内核配置。 在linux kernel Configuration对话框中(如图3所示)。Character devices菜单设置Virtual terminal和Support for consoleon virtual terminal为Y,Console drivers菜单设置Support Frame buffer devices为Y,并点击Frame-buffer support后进入Framebuffer支持配置界面进行设置。 配置完成后开始编译uClinux,在编译前必须将gcc编译工具链的安装路径添加到系统默认路径。进人uClinux-dist目录依次运行命令make dep、make clean、make lib_only、make user_only、make romfs、make image,最终生成uClinux内核映像文件以及文件系统的映像文件,可以将它们烧写到flash上。 4 MiniGUI的移植 由于MiniGUI较好地将硬件设备抽象为GAL层和IAL层,移植时只需要针对自身的硬件特点按照GAL层调用接口和IAL层调用接口来做内部实现即可。实现了对framebufer的支持后,配置MiniGUI选择Native的GAL引擎,便可以使用framebuffer作为MiniGUI的图形发生引擎。 MiniGUI的IAL层将输入设备的输入事件最终映射为GUI系统API层的消息事件。IAL层默认处理两种设备的输入操作:键盘设备和鼠标设备。键盘设备向上层提供不同的按键输入信息,鼠标设备提供点击、抬起和落笔坐标等的信息。在实现MiniGUI与输入设备驱动的接口时,采用Select的方式获得输入设备的动作,并转换为消息队列中的消息。消息参数按照Win32接口定义为点击键编号或鼠标当前的坐标。通过编写针对硬件开发系统的IAL支持代码,实现IAL层的移植。 具体的移植过程如下: 下载MiniGUI的函数库文件源代码包libMiniGUI-1.3.3.tar.gz和资源文件包MiniGUI-res-1.3.3.tar.gz,分别进行移植。由于MiniGUI使用了自由软件常用的automake和autoconf接口,因此其配置和编译非常容易。 解压缩库文件源码包后,进入MiniGUI源代码目录,运行autogen.sh脚本文件,陔文件可以简单地重新生成所有与配置相关的文件,然后为当前的构建环境配置软件。库文件的编译配置主要通过执行源程序根目录下configure这个文件,并给它传递相关的参数来实现,如编译环境所在的主机类型(--host选项)、目标平台类型(--target选项)以及函数库的安装路径(--prefix选项)等。 由于要配置成MiniGUI-Standalone模式, 此还需要加上参数:--enable-standalone。参数设置好后执行configure文件,生成一个标准的Makefile文件,执行make命令开始编译,编译结束后执行make install命令进行安装。 安装MiniGUI资源文件MiniGUI-res比较简单,只要修改目录树下的configure.linux文件,将prefix选项改为和刚才的安装路径一致就可以了,然后直接执行make install进行安装。 编译MiniGUI应用程序的时候,可以先单独编译MiniGUI程序,生成该程序的可执行文件,然后复制到uClinux-dist的rotors目录中,执行makeimage命令,生成映像文件,烧写到flash上后可以在目标板上运行该程序。 5 结束语 本文介绍了MiniGUI的特点和体系结构,在配置和编译uClinux系统的基础上,将MiniGUI成功移植到了目标平台上。熟悉图形应用程序的用户可以很快在MiniGUI上面编写自己的图形应用程序。随着MiniGUI的不断推广和功能的加强,它将在嵌入式系统设计中起着举足轻重的作用,并且在实际应用中不断走向成熟。 参考文献 [1]闰玉忠,石理.嵌入式Linux的MiniGUl研究和移植 [2].单片机与嵌入式系统应用,2003(6):2-3 [2]李善平,刘文峰,王焕龙等.Linux与嵌入式系统[M].北京:清华大学出版社,2003, [3]飞漫公司:MiniGUI Technology White Paper
|