1. 引言
随着嵌入式系统应用越来越来广泛,以及嵌入式系统资源的日益丰富、性能的大幅度提
高,人们对嵌入式系统中的人机交互接口的要求也越来越高。配备图形用户接口,在一些消
费类产品中已经不可缺少,比如常见的手机、PDA、手持设备等。
嵌入式领域中出现了专门的公司致力于开发Linux 下的GUI,从而大大提升了嵌入式
GUI 的研发速度。随着GUI 的不断完善,在嵌入式 Linux 中出现了一批高性能、轻量级的
GUI 系统,主要包括:紧缩的XWindow、MiniGUI、Microwindows、OpenGUI、Qt/Embeded
等。相比较而言,MiniGUI 得到许多厂商的青睐,并有着良好的发展势头,目前已经在很
多项目中得以应用。
MiniGUI 是一个比较成熟的图形用户接口支持系统,是一个能广泛应用于各种嵌入式系
统的高效、可靠、可定制、小巧灵活的图形用户接口支持系统;其分层体系结构设计使得其
具有较好的可移植性。在MiniGUI 的开发中,应用程序是最上层的开发,其交互界面直接
通过MiniGUI 图形系统的API 接口函数实现。MiniGUI 屏蔽了底层显示、输入设备编程的
细节,使程序员更能专注于信息终端界面的功能特 {MOD},从而缩短了编程投入时间。MiniGUI
图形系统经编译安装后一般以库的形式存放在操作系统中。基于MiniGUI 的系统框架结构
如图1-1 所示[1]。
用户应用程序
MiniGUI 图形用户界面
Linux 操作系统
硬件平台
图1-1 系统框架图
2. MiniGUI 的交叉编译
2.1 MiniGUI 的体系结构与可移植性
MiniGUI 具有许多的特点,例如:提供完备的多窗口机制和消息传递机制,提供常用的控
件类、对话框和消息框支持,界面皮肤支持, Windows 资源文件和图像文件支持,多字符集和
多字体支持,汉字(GB2312)输入法支持等等。
从整体上看,如图2-1 所示[5],MiniGUI 是分层设计的:最顶层的API 是提供给用户使用
的编程接口;中间层 MiniGUI 核心则包括了窗口系统的各个模块;最底层的GAL 和IAL
为MiniGUI 提供了底层的Linux 或者XWindow 上的图形接口支持以及输入设备如鼠标、键
盘等的驱动;而PThread 则是提供了内核级线程支持的函数库。MiniGUI 的分层体系结构中
的GAL 和IAL,大大提高了MiniGUI 的可移植性,并且使程序的开发和调试变得更加容易:
可以在Windows 使用接口的模拟器wvfb,当MiniGUI 程序调试成功后会加载到嵌入式Linux
的文件系统中。但无论是何种开发平台,MiniGUI 的开发都是基于标准C 语言的,调用标
准C 语言格式的API 函数来实现MiniGUI 核心部分的操作,从MiniGUI 体系结构看,API
是与平台无关的。
图 2-1 MiniGUI 体系结构
本文是基于S3C2440ARM9 开发板和Linux 来移植MiniGUI1.3.3 版本的,在移植的过
程中采取了宿主机和目标板的开发模式。
2.2 建立交叉编译环境
在宿主机(虚拟机Linux)上建立MiniGUI 的交叉编译环境,首先要获得支持目标平台的
交叉编译工具链这里使用的是arm-linux-gcc-2.95.3.tgz,将该文件拷到宿主PC 机上,执行以
下命令:
# tar -xvzf arm-linux-gcc-2.95.3.tgz –C /
这样将默认安装到 /usr/local/arm/2.95.3/bin,然后将该目录添加到系统环境量PATH 中执行:
# vi /root/.bashrc 并且在最后一行添加语句export PATH=$PATH:/usr/local/arm/2.95.3/bin。接
着执行# source /root/.bashrc,以使环境变量生效。
2.3 交叉编译MiniGUI 库函数,并进行配置安装
MiniGUI 是利用Automake 和Autoconf 接口实现自动配置、编译和安装。无论是基于
X86 的 PC 平台还是其他目标平台,用户配置、编译和安装MiniGUI 的过程都是大致相同
的,用户只要使用“./configure”、“make”、“make install”三条命令就可以把程序或函数编译并
安装到系统中。惟一不同的是在运行“./configure” 命令时要根据上一步所安装、设置的交叉
编译环境及不同的目标平台设置不同的命令行参数。
2.3.1 MiniGUI 资源程序包的安装
对源程序包进行安装之前,首先在/opt 目录下建立一source 目录以存放源代码包。即执
行以下命令建立相应的目录[4]:
# mkdir –p /opt/source
先将minigui-res-1.3.3.tar.gz 源代码包拷贝到/opt/source 下,所需的资源文件源代码包位于
/opt/source 目录下。安装资源文件时进入到 minigui-res-1.3.3.tar.gz 所在目录执行以下命令进
行解压并安装:
# tar -zxvf minigui-res-1.3.3.tar.gz
# cd minigui-res-1.3.3
# make install
这样资源文件就安装到默认路径/usr/local/lib/minigui 下,这个文件夹内是一些MiniGUI
程序运行时使用的资源,例如位图、图标、光标之类的。
2.3.2 MiniGUI 库文件的交叉编译
先将 libminigui-1.3.3.tar.gz 源代码包拷贝到/opt/source 下,所需的资源文件源代码包位
于/opt/source 目录下。安装资源文件时进入到 minigui-res-1.3.3.tar.gz 所在目录执行以下指令
进行解压:# tar -zxvf minigui-res-1.3.3.tar.gz
MiniGUI 的应用程序运行时要有动态库的支持,而最后无论是应用程序还是动态共享
库连接都要在 ARM 平台上运行,MiniGUI 库函数要利用ARM 的编译器进行交叉编译。所
以在编译应用程序之前,要配置MiniGUI 的lib 库。在libinigui-1.3.3 目录中配置lib,增加开
关项如下所示:
./configure --host=arm-unknown-linux --enble-jpgsupport=no --enable-pngsupport=no
--enble-gifsupport=no --disable-lite --prefix=/usr/local/arm/2.95.3/arm-linux
--enable-smdk2440ial=yes 以上几个选项的具体意义如下:
(1) --host=arm-unknown-linux:指定宿主机平台类型,即交叉编译器本身运行所在的机器类型。
一般情况下是指x86 体系的PC 机,通常系统能自动识别,也可不指定;
(2) --prefix=/usr/local/arm/2.95.3/arm-linux:指定MiniGUI 函数库、头文件及参考手册的安装
路径。它应该是所使用的交叉编译环境中系统头文件目录include 和库目录 lib 所在的目录,
使得执行 make install 后,相应文件自动安装在该路径下的各个子目录下(lib、include、res 等);
(3) 以--disable-FEATURE 或--enable-FEATURE 的形式出现,它是功能特性开关选项,从而
使用户可以根据目标需求选择MiniGUI 的功能特性,而且编译完成后还可以用交叉编译工具
链中的/usr/local/arm/2.95.3/bin/arm-linux-strip *来对 MiniGUI 函数库进行剪裁;
(4) --smdk2440ial=yes 指明使用smdk2440ial 功能,对LCD 相关操作支持在src/ial/2440.c。这
一项的选择主要是由于使用的目标板是 ARM2440 开发板。
为了让其适合于本文的平台还要修改lib 库的相关选项,修改 configure 配置文件, 在文
件开头增加指定编译器路径。
(1) CC=/usr/local/arm/2.95.3/bin/arm-linux-gcc
(2) CPP=/usr/local/arm/2.95.3/bin/arm-linux-cpp
(3) LD=/usr/local/arm/2.95.3/bin/arm-linux-ld
(4) AR=/usr/local/arm/2.95.3/bin/arm-linux-ar
(5) RANLIB=/usr/local/arm/2.95.3/bin/arm-linux-ranlib
(6) STRIP=/usr/local/arm/2.95.3/bin/arm-linux-strip
接下来依次执行指令make, make install,这样就会在/usr/local/arm/2.95.3/arm-linux/生成
MiniGUI 函数库、头文件和参考手册,删除目录下的lib 中的*.a,*.la 文件,执行:
# arm-linux-strip *来实现对MiniGUI 的剪裁,由于*.a,*.la 文件是MiniGUI 得到静态链接库,
而目标板所用的是动态链接库所以删除它们可以减小MiniGUI 库的大小。
其实在实际编译应用程序的过程中,MiniGUI 的编译需要一些其他库文件的支持,缺省
我们的gcc 基本上都有这些库文件,所以不需要安装,可是现在要交叉编译了,交叉编译器可是
不带这些库文件的,所以我们得自己编译这些库文件并装到交叉编译器中去。比如说
zlib-1.2.3.tar.gz、libpng-1.0.10rc1.tar.gz、jpegsrc.v6b.tar.gz、freetype-1.3.1.tar.gz 等,这些文件
的安装和编译与MiniGUI 资源文件和库文件安装类似,可以参考以上的安装过程,在此不
再赘述。
2.3.3 移植MiniGUI
在嵌入式系统开发过程中,编译完MiniGUI 和应用程序后,要把MiniGUI 库、资源和应用
程序生成在目标系统可执行的文件,而后再将其移到目标板上,这样一个完整的项目移植才算
完成[3]。
假设你已经有一个可以在板子上跑的Linux 系统了,并且已经有一个可以用的根文件系
统了,并且已经有了板子相对应的LCD 的驱动程序,这里简单介绍怎么在你的根文件系统里
加上MiniGUI 使得你的板子有图形界面的显示。
假设可用根文件系统目录叫rootfs,若当前路径已经在rootfs 目录下,则利用以下指令在
rootfs 目录下建立相应的子目录如下所示:# mkdir –p ./usr/local/[lib,etc]
然后将/usr/local/arm/2.95.3/arm-linux/lib 中相应的库拷到rootfs/usr/local/lib 目录下,同时
修改rootfs/etc/ld.so.conf,在ld.so.conf 文件中添加路径/usr/local/lib,然后执行# ldconfig
–r ./rootfs,这样库文件准备完毕,下面把资源文件也拷过来,资源文件被安装在
/usr/local/lib/minigui 目录下# cp –r –a /usr/local/lib/minigui rootfs/usr/local/lib 连目录一起拷
过去,目录结构和主机保持一致,把配置文件也拷过去# cp /usr/local/etc/MiniGUI.cfg
rootfs/usr/local/etc 同时修改一下该配置文件以使LCD 能够正常显示。板子文件系统构建完
毕。
通过 NFS 启动系统,当 NFS 服务设置好并启动后,我们就可以把 NFS 作为根文件系
统来启动开发板了。通过使用NFS 作为根文件系统,开发板的“硬盘”就可以变得很大,因
为您使用的是主机的硬盘,这是使用linux 系统作为开发工具经常使用的方法。
将 MiniGUI 成功地移植到S3C2440 开发板上后,就可把注意力集中在MiniGUI 的图形
用户接口程序的开发工作上,而这需要深入了解MiniGUI 的工作机制,熟悉其应用程序框
架及丰富的 API 函数接口等。
3. MiniGUI 应用示例
3.1 开发方法
MiniGUI1.3.3 图形界面的运行流程如图3-1 所示[2],跟Windows 下GUI 程序设计原理
相近,有Windows 下GUI 编程经验的人几乎不费什么功夫就能实现经典的“Hello World”程
序。
Y
N
N
图 3-1 MiniGUI 应用程序开发流程图
3.2 应用举例
以下示例是利用MiniGUI 做好的一个界面,如图3-2 所示[],其功能是实时采集GPS 数
据,并在电子地图上显示,同时能够上下左右平移电子地图,也能够实时显示当前的经纬度
信息,能够实现地图的缩小和放大功能[6]。
对话框函数
程序入口点
MiniGUIMain
MiniGUI 为lite 版本
创建主窗口
开始主窗口消息循环
显示所创建的窗口
窗口过程函数
屏幕输出
程序退出
设置显示区域
SetDesktopRect
调用对话框回调函数
4. 总结
MiniGUI 是一个非常适合于嵌入式系统的,移植MiniGUI 的过程往往是系统开发时的
一大难点, MiniGUI 体系结构随着应用的发展不断变化,旧版本在开发中出现诸多不便,本
文针对 MiniGUI1.3.3 版本以 S3C2440(ARM9)开发板为例,详细阐述了其移植的过程,并
对 MiniGUI 应用程序设计的基本框架进行了相应阐述, 给出 MiniGUI 电子地图的显示应
用示例, 本文的研究也可为其他基于Linux 和 MiniGUI 的嵌入式系统的开发提供参考。