近几年,嵌入式Linux系统已得到广泛的应用,相应的图形用户界面的开发也日趋重要,MiniGUI正是其中的一个轻量级的图形用户界面支持系统。本文剖析了嵌入式操作系统下图形用户界面MiniGUI的结构和特征,描述了将MiniGUI在ARMLinux下的移植方式与过程,并对这些基于MiniGUI的嵌入式系统开发做了展望。
0序言
近些年来随着嵌入式设备与市场需求的广泛结合,手机、PDA等产品的应用对可视化操作界面的简约和便捷提出了更高的要求,这都须要一个稳定可靠的高性能GUI系统来提供支持。图形用户界面(GraphicUserInterface,简称GUI)的广泛流行是现今计算机技术的重要成就之一,它极大地便捷了非专业用户的使用,人们可以通过窗口、菜单便捷地进行操作。嵌入式系统对GUI的基本要求包括有重型、占用资源少、高性能、高可靠性以及可配置等。MiniGUI是目前比较常用的几种GUI系统之一,与其他的GUI相比,MiniGUI最显着的特征就是重型、占用资源少,但是在这几年的发展里,MiniGUI早已十分成熟和稳定了,在许多产品和项目中都已得到了实际应用。
1MiniGUI的特性和体系结构
1.1MiniGUI的特征
MiniGUI是由原复旦学院班主任魏永明主持开发的轻量级图形系统,是一种面向嵌入式或实时系统的图形用户界面支持系统。它遵守GPL公约,是基于SVGALib及LinuxThread库的多窗口GUI支持系统。能跨多种操作系统,主要运行于linux及一切具有POSIX线程支持的POSIX兼容系统,包括普通嵌入式Linux、eCos、uC/OS-II、VxWorks等系统,是国外最早的自由软件之一。
MiniGUI的主要特征有:(1)遵守GPL条款的纯自由软件;(2)提供了完备的多窗口机制;(3)多字符集和多字体支持,目前支持ISO8859-1、GB2312及Big5等字符集,而且支持各类光栅字体和TrueType、Type1等矢量字体;(4)简拼和五笔等汉字输入法支持;(5)BMP、GIF、JPEG及PCX等常见图象文件的支持;(6)Windows的资源文件支持,如位图、图标、光标、插入符、定时器及加速键等;(7)可移植性好。
1.2MiniGUI的体系结构
1.2.1多线程的分层设计
从整体结构上看,MiniGUI是分层设计的,结构如图1所示。在最底层,GAL(图形具象层)和IAL(输入具象层)及键盘和鼠标的驱动;中间层是MiniGUI的核心层,包括窗口系统必不可少的各个模块;最顶楼是API,即编程插口。GAL和IAL为MiniGUI提供了底层的Linux控制台或则XWindow上的图形插口以及输入插口,而Pthread用于提供内核级线程支持的C函数库。借助GAL和IAL,大大提升了MiniGUI的可移植性,而且使程序的开发和调试显得愈发容易。
MiniGUI本身运行在多线程模式下,它的许多模块都以单独的线程运行,同时,MiniGUI还借助线程来支持多窗口。从本质上讲,每位线程有一个消息队列,消息队列是实现线程数据交换和同步的关键数据结构。一个线程向消息队列中发送消息,而另一个线程从这个消息队列中获取消息,同一个线程中创建的窗口可共享同一个消息队列。一个线程向消息队列中发送消息,而另一个线程从这个消息队列中获取消息,同一个线程中创建的窗口可共享同一个消息队列。借助消息队列和多线程之间的同步机制,可以实现下边要提到的微顾客/服务器机制。
1.2.2微顾客/服务器结构
在多线程环境中,与多进程间的通信机制类似,线程之间也有交互和同步的需求。例如,拿来管理窗口的线程维持全局的窗口列表,而其他线程不能直接更改那些全局的数据结构,而必须根据“先来先服务”的原则,依次处理每位线程的恳求,这就是通常性的顾客/服务器模式。MiniGUI借助线程之间的同步操作实现了顾客线程和服务器线程之间的微顾客/服务器机制。
2开发环境
H2410EB开发板由上海恒颐高科技术有限公司设计开发,它基于Samsung公司的S3C2410A20嵌入式ARM处理器。S3C2410A20内嵌ARM920920T核,带有全性能的MMU,具有高性能、低帧率、低成本、小容积等优点,适用于手持设备、汽车等领域。
H2410EB除带有大容量的SDRAM和Flash以外,还扩充了RS-232C串行插口、10Mbps以太网插口、触摸屏插口、音频输入/输出插口、USBHost、USBSlave、UART插口、IIC插口、用户自定义按键、LCD显示器,便捷用户使用和进行参考设计。它支持嵌入式Linux操作系统的运行,支持MP3/MPEG播放、GUI、Web服务及其它服务,同时可依据用户需求开发特定软件与设备驱动程序。
操作系统采用裁减后的Linux,LinuxKernel版本为v2.4.18,系统使用的交叉编译器是arm-Linux-gcc。另外,还有驱动程序源码和测试程序源码等代码模块。
3MiniGUI的移植
本文中使用的主机系统为RedHatLinux9.0,移植目标系统为Linux2.4.18,MiniGUI的版本是1.6.9。在主机上交叉编译MiniGUI链接库,之后将针对目标机编译的库文件,与根文件系统一起烧讲到目标板的RAM空间,之后将运行在目标板上的图形用户界面直接链接到该库,脱离主机独立运行。
3.1Linux交叉编译环境的建立
GUI的编译一般都是在PC机上执行的,也就是说,编译器本身能否在PC机上执行,同时编译源代码生成的二补码文件必须能在目标机上执行,这类编译器一般称为交叉编译器。对于ARM平台,我们安装了cross-arm-binutils-2.10-1.i386.rpm、cross-arm-gcc-2.95.3-2.i386.rpm、cross-arm-glibc-2.1.3-2.i386.rpm这三个包。这种包都可以从网上免费获取。arm-binutils这个包通常包含了一些针对ARM平台的二补码工具,例如arm-strip、arm-ar等命令;arm-glibc这个鞋子含的是标准C的函数库的ARM的版本以及对应的头文件;arm-gcc中包含的则是生成ARM平台代码的x86上的交叉编译器。执行rpm命令将这种包安装到PC机上,若不在系统默认搜索目录下嵌入式linux下界面开发,则必须将安装目录加到系统的PATH环境变量中,这样在每次编译时系统能够找得到编译器。
以root用户登录Linux系统,在主机上用rpm指令安装交叉编译工具,arm-linux-gcc将被安装到/usr/local/arm/2.95.3/下边。此时,gcc为/usr/local/arm/2.95.3/bin/arm-linux-gcc,而它的include为/usr/local/arm/2.95.3/arm-linux/include,对应的lib为/usr/local/arm/2.95.3-/arm-linux/lib。之后,在你的bashrc中添加环境变量即可。执行vi.bashrc,最后一行加入:exportPATH=$PATH:/usr/local/arm/2.95.3/bin路径,保存退出后执行source.bashrc。
另外须要注意的是,编译时所用的函数库版本要与目标版上运行时所用的函数库版本一致。经过上述步骤,就早已构建了交叉编译环境,接出来的就是进行MiniGUI的选项配置和交叉编译。
3.2MiniGUI的配置和交叉编译
我们可以从网上免费得到MiniGUI-1.6.9的资源文件压缩包,MiniGUI1.6.9的源程序包包括以下三个部份:libminigui-1.6.9.tar.gz-MiniGUI函数库源代码;miniguires-1.6.9.tar.gz-MiniGUI所使用的资源,包括基本字体、图标、位图、输入法等;mde-1.6.9.tar.gz-MiniGUI的综合演示程序。
3.2.1MiniGUI函数库的安装和编译
步入目录libminigui-1.6.9,再运行。/configure脚本:CC=arm-linux-gcc。/configure--prefix=/mnt/nfs/local--build=i386-linux--host=arm-linux--target=arm-linux--disable-lite--disable-micemoveable--disable-cursor
在这儿,CC是拿来指定所使用的编译器,arm-linux-gcc即为安装到主机上的交叉编译工具。另外,--prefix为MiniGUI函数库的安装目标路径;--build是指执行编译的主机;--host交叉编译后的程序将运行的系统;--target是运行该编译器所形成的目标文件的平台;--disable-lite构建MiniGUI-Threads版本的应用程序;--disable-micemoveable严禁窗口联通;--disable-cursor因为系统采用触摸屏linux虚拟机,所以用此选项拿来关掉键盘光标显示。
假如运行。/configure脚本成功通过,就可继续进行下边的编译了,执行make和makeinstall命令编译安装libminigui。这儿要注意的是,执行makeinstall命令时要切换到Root用户权限下,不然安装时无法把文件装到指定目录下。安装成功后,MiniGUI的函数库和头文件以及配置文件等资源将被安装到/usr/local/arm/2.95.3/arm-linux/目录中,具体情况为:函数库被装在lib/子目录中;头文件被装在include/子目录中;指南被装在man/子目录中;配置文件被装在etc/子目录中。
3.2.2MiniGUI资源的编译安装
主机上解压资源文件:tarzxfminiguires-1.6.9.tar.gz,可生成miniguires-1.6.9目录。在安装之前先要更改目录中的configure.linux文件,执行viconfigure.linux打开文件,把prefix选项部份的默认值/usr/local/改为/usr/local/arm/2.95.3/arm-linux/,这样运行makeinstall安装命令后MiniGUI资源将被安装到目标系统中的/usr/local/arm/2.95.3/arm-linux/lib/minigui-/res的目录下。
3.2.3实例程序的编译安装
解压mde-1.6.9.tar.gz并步入该目录,更改目录下配置文件configure.in,把其中的AC_CHECK_HEADERS(minigui/commmon.h,have_libminigui=yes,foo=bar)中的minigui/-commmon.h改为$prefix/include/minigui/common.h,来指定交叉编译时搜minigui的头文件路径,避免编译时系统找不到头文件;在所有LIB=“$LIB后加入–L{prefix}/lib来指定编译时所须要库文件的路径。并将libpopt-dev-arm-cross-1.6.tgz解压所生成的头文件和库文件分别装入目标目录的include和lib中,用以支持mde中程序在ARM下的交叉编译。之后执行。/autogen.sh,重新生成configure脚本,使用前面配置的脚本之后执行make命令,即可完成实例程序的编译。
4拷贝MiniGUI资源到开发板
编译完MiniGUI和实例程序以后,须要把MiniGUI库、资源和应用程序拷贝到为目标机器打算的文件系统目录中,之后生成文件系统映像,再下载到目标板上运行。可以通过并口、USB口或以太网口将文件系统映像下载到目标机器中。在执行程序之前,还有一件重要的事情要做,就是在开发板上的Linux中配置好MiniGUI的运行环境。
5板载Linux的环境配置
MiniGUI可以使用多种图形引擎进行图象显示,有qvfb、SVGALib、LibGGI等等,其实也可以自己编撰一个图形引擎供MiniGUI使用。这儿我们使用qvfb来作为MiniGUI的图形引擎进行图象显示。qvfb(vituralframebuffer)是在宿主机上模拟帧缓冲的,它是XWindow拿来运行和测试应用程序的系统程序,使用了共享储存区域(虚拟的帧缓冲)来模拟帧缓冲而且在一个窗口中模拟一个应拿来显示帧缓冲。
首先对qvfb进行安装,可以从网上下载,下载出来后进行解压:tarzxfqvfb-1.0.tar.gz并步入到qvfb-1.0目录,执行。/configure脚本后即可用make和makeinstall命令进行编译安装。
修改MiniGUI的配置文件MiniGUI.cfg设置设备驱动程序,设置显示区域及字体等内容。更改/usr/local/etc目录下的配置文件MiniGUI.cfglinux定时器,将其中的驱动引擎gal_engine和ial_engine设置为qvfb,再将其中qvfb的defaultmode设置为合适的显示模式。之后把qvfb加到可执行路径中去,执行vi.bashrc命令,在.bashrc最后面加上exportPATH=/usr/local/arm/2.95.3/bin-:$PATH嵌入式linux下界面开发,保存退出后用source.bashrc命令执行一下即可。
在XWindow中,打开一个终端仿真程序,执行qvfb&命令。在qvfb中选中FileConfigure,将qvfb设置成嵌入式开发系统的液晶屏的大小。合理设置MiniGUI的配置文件后,接着就可以运行MiniGUI应用程序了。
执行应用程序顺利的话,屏幕上可以看见程序的运行界面。至此,MiniGUI早已成功移植到目标系统上。随后,我们可以按照须要,继续更改MiniGUI库函数及各类资源,而且编撰自己的应用程序,使图形用户界面愈发建立。
6结束语
随着嵌入式产品应用领域的日渐下降,开发出优秀的人机交互界面,是嵌入式发展的趋势,拥有宽广的市场前景。MiniGUI可以稳定可靠的运行在Linux系统下,通过上述具体的移植和后续的MiniGUI下嵌入式软件的开发过程,能快速建立一个嵌入式可视化软件系统,相信这些嵌入式系统将会得到越来越多的应用。