嵌入式 Linux 環境下MiniGUI 的研究與移植
關鍵詞:嵌入式Linux;圖形用戶界面;MiniGUI
Abstract:Recently, the embedded system on Linux has been used broadly. At the same time, the related development of graphic user interface is more and more important. MiniGUI is based on a lightweight GUI support system. This paper describes the structure and characteristics of MiniGUI, explains the method and process in porting of MiniGUI graphical system under the ARM Linux, and forecasts the embedded system based on MiniGUI.
Keywords: Embedded Linux; GUI; MiniGUI
0 前言
近年來隨著嵌入式設備與市場需求的廣泛結合,手機、PDA、DVD播放機等產品的應用對可視化操作界面的簡潔和方便提出了更高的要求,這都需要一個穩定可靠的高性能GUI系統來提供支持。圖形用戶界面(Graphic User Interface,簡稱GUI)的廣泛流行是當今計算機技術的重要成就之一,它極大地方便了非專業用戶的使用,人們可以通過窗口、菜單方便地進行操作。由于嵌入式系統實時性要求高,同時嵌入式系統硬件配置又有限,所以對輕型GUI的需求更加突出。另外,嵌入式系統往往是一種訂制設備,它們對GUI的需求也各不相同,因此GUI也必須是可訂制的。綜上所述,嵌入式系統對GUI的基本要求應包括輕型、占用資源少、高性能、高可靠性以及可配置。MiniGUI是目前比較常用的幾種GUI系統之一,與其他的GUI相比,MiniGUI最顯著的特點就是輕型、占用資源少,而且在這幾年的發展里,MiniGUI已經非常成熟和穩定了,在許多產品和項目中都已得到了實際應用。
1 MiniGUI的特點和體系結構
1. 1 MiniGUI的特點
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.2 MiniGUI的體系結構
1.2.1多線程的分層設計
從整體結構上看,MiniGUI是分層設計的,結構如圖1所示。在最底層,GAL(圖形抽象層)和IAL(輸入抽象層)及鼠標和鍵盤的驅動;中間層是MiniGUI的核心層,包括窗口系統必不可少的各個模塊;最頂層是API,即編程接口。GAL和IAL為MiniGUI提供了底層的Linux控制臺或者X Window上的圖形接口以及輸入接口,而Pthread用于提供內核級線程支持的C函數庫。利用GAL和IAL,大大提高了MiniGUI的可移植性,并且使程序的開發和調試變得更加容易。可以在X Window上開發和調試自己的MiniGUI程序,通過重新編譯就可以讓MiniGUI應用程序運行在特殊的嵌入式硬件平臺上。
MiniGUI本身運行在多線程模式下,它的許多模塊都以單獨的線程運行,同時,MiniGUI還利用線程來支持多窗口。從本質上講,每個線程有一個消息隊列,消息隊列是實現線程數據交換和同步的關鍵數據結構。一個線程向消息隊列中發送消息,而另一個線程從這個消息隊列中獲取消息,同一個線程中創建的窗口可共享同一個消息隊列。一個線程向消息隊列中發送消息,而另一個線程從這個消息隊列中獲取消息,同一個線程中創建的窗口可共享同一個消息隊列。利用消息隊列和多線程之間的同步機制,可以實現下面要講到的微客戶/服務器機制。

1.2.2微客戶/服務器結構
在多線程環境中,與多進程間的通訊機制類似,線程之間也有交互和同步的需求。比如, 用來管理窗口的線程維持全局的窗口列表, 而其他線程不能直接修改這些全局的數據結構, 而必須依據“先來先服務”的原則,依次處理每個線程的請求,這就是一般性的客戶/服務器模式。MiniGUI利用線程之間的同步操作實現了客戶線程和服務器線程之間的微客戶/服務器機制。
2 開發環境
H2410EB開發板由北京恒頤高科技術有限公司設計開發,它基于Samsung公司的S3C2410A20嵌入式ARM處理器。S3C2410A20內嵌 ARM920T 核,帶有全性能的MMU,具有高性能、低功耗、低成本、小體積等優點,適用于手持設備、汽車等領域。
H2410EB除帶有大容量的SDRAM和Flash以外,還擴展了RS-232C串行接口、10Mbps以太網接口、觸摸屏接口、音頻輸入/輸出接口、USB Host、USB Slave、UART接口、IIC接口、用戶自定義鍵盤、LCD顯示器,方便用戶使用和進行參考設計。它支持嵌入式Linux操作系統的運行,支持MP3/MPEG播放、GUI、Web 服務及其它服務,同時可根據用戶需求開發特定軟件與設備驅動程序。
操作系統采用裁減后的Linux,Linux Kernel版本為v2.4.18,系統使用的交叉編譯器是arm-Linux-gcc。另外,還有驅動程序源碼和測試程序源碼等代碼模塊。
3 MiniGUI的移植
本文中使用的主機系統為Red Hat Linux 9.0,移植目標系統為Linux2.4.18,MiniGUI的版本是1.6.9。在主機上交叉編譯MiniGUI鏈接庫,然后將針對目標機編譯的庫文件,與根文件系統一起燒寫到目標板的RAM空間,以后將運行在目標板上的圖形用戶界面直接鏈接到該庫,脫離主機獨立運行。
3.1 Linux交叉編譯環境的構建
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機上,若不在系統默認搜索目錄下,則必須將安裝目錄加到系統的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
最后一行加入:export PATH=$PATH:/usr/local/arm/2.95.3/bin路徑
保存退出后執行source .bashrc
另外需要注意的是,編譯時所用的函數庫版本要與目標版上運行時所用的函數庫版本一致。經過上述步驟,就已經建立了交叉編譯環境,接下來的就是進行MiniGUI的選項配置和交叉編譯。
3.2 MiniGUI的配置和交叉編譯
我們可以從網上http://www.minigui.com/download)免費得到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.1 配置MiniGUI選項
把函數庫文件包解壓:tar zxf libminigui-1.6.9.tar.gz,進入libminigui-1.6.9這個目錄,執行make menuconfig命令
-system wide options中選擇Build MiniGUI-Lite,并取消Use incore (built-in) resource選項;
-Gal engine options 圖形引擎,根據目標機的顯示方式確認,這里只勾選了 NEWGal engine on Linux FrameBuffer console,其它的不選;
-Ial engine options輸入引擎,可用觸摸屏只選了SMDK2410 Touch Screen;
-Font Options 中取消選擇Var bitmap font,可能是因為Bug的原因,當選擇了該選項后,編譯測試例子的時候總是提示unreferenced vfb_Courier …之類的錯誤;
-Image options選擇了Includes SaveBitmap-related functions。GIF、JPG、PNG圖形格式也勾選上;
-Development environment options 里使用Linux平臺,arm-linux-gcc編譯器,安裝路徑設置在 /usr/local/arm/2.95.3/arm-linux/。
其它的用缺省選項就可以了,保存退出。
3.2.2 MiniGUI函數庫的安裝和編譯
進入目錄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由于系統采用觸摸屏,所以用此選項用來關閉鼠標光標顯示
如果運行./configure腳本成功通過,就可繼續進行下面的編譯了,執行make和make install命令編譯安裝libminigui。這里要注意的是,執行make install命令時要切換到Root用戶權限下,不然安裝時沒法把文件裝到指定目錄下。安裝成功后,MiniGUI 的函數庫和頭文件以及配置文件等資源將被安裝到/usr/local/arm/2.95.3/arm-linux/目錄中,具體情況為:函數庫被裝在lib/ 子目錄中;頭文件被裝在include/ 子目錄中;手冊被裝在man/ 子目錄中;配置文件被裝在etc/ 子目錄中。
3.2.3 MiniGUI資源的編譯安裝
主機上解壓資源文件:tar zxf miniguires-1.6.9.tar.gz,可生成miniguires-1.6.9目錄。在安裝之前先要修改目錄中的configure.linux文件,執行vi configure.linux打開文件,把prefix選項部分的默認值 /usr/local/ 改為 /usr/local/arm/2.95.3/arm-linux/,這樣運行make install安裝命令后MiniGUI資源將被安裝到目標系統中的/usr/local/arm/2.95.3/arm-linux/lib/minigui-
/res的目錄下。
3.2.4 實例程序的編譯安裝
解壓mde-1.6.9.tar.gz并進入該目錄,修改目錄下配置文件configure.in,把其中的AC_CHECK_HEADERS(minigui/commmon.h, have_libminigui=yes, foo=bar)改為
AC_CHECK_HEADERS($prefix/include/minigui/common.h,have_libminigui=yes,foo=bar),來指定交叉編譯時搜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口或以太網口將文件系統映像下載到目標機器中。如果發現子目錄lib 中的MiniGUI 庫文件很大,很難全部拷貝到開發板上的話,可以對庫文件執行arm-linux-strip操作,arm-linux-strip指令會除去文件中的調試信息,使文件體積大大縮小。另外需要注意的是,有些庫函數是鏈接文件,如果單純的拷貝,會將原先的鏈接信息丟失,造成不必要的麻煩。使用tar命令將所需拷貝的資源打包,其中包括etc子目錄下的配置文件MiniGUI.cfg;lib 子目錄下的libmgext-1.6.9.so.0.0、libminigui-1.6.9.so.0.0、libvcongui-1.6.9.so.0.0和minigui子目錄;mde-1.6.9目錄下的可執行程序。將這些資源燒寫進ramdisk文件系統中,解壓后將MiniGUI的配置文件MiniGUI.cfg放入/usr/local/etc目錄中,MiniGUI的庫文件放入/usr/local/lib目錄中。在執行程序之前,還有一件重要的事情要做,就是在開發板上的Linux中配置好MiniGUI的運行環境。
5板載Linux的環境配置
MiniGUI可以使用多種圖形引擎進行圖像顯示,有qvfb、SVGALib、LibGGI等等,當然也可以自己編寫一個圖形引擎供MiniGUI使用。這里我們使用qvfb來作為MiniGUI的圖形引擎進行圖像顯示。qvfb(vitural framebuffer)是在宿主機上模擬幀緩沖的,它是X Window用來運行和測試應用程序的系統程序,允許我們在桌面及其上開發Qt嵌入式程序,而不需要在命令臺和程序之間來回切換。qvfb使用了共享存儲區域(虛擬的幀緩沖)來模擬幀緩沖并且在一個窗口中(qvfb)模擬一個應用來顯示幀緩沖,顯示的區域被周期性的改變和更新。通過指定顯示設備的寬度和顏色深度,虛擬出來的緩沖幀和物理的顯示設備在每個像素上保持一致。這樣我們在每次調試應用時不需要總是刷新嵌入式設備的FLASH存儲空間,從而加速了應用的編譯、連接和運行周期。
首先對qvfb進行安裝,可以從這里下載http://www.minigui.com/downloads/dep-libs/qvfb
-1.0.tar.gz),下載下來后進行解壓:tar zxf qvfb-1.0.tar.gz并進入到qvfb-1.0目錄,執行./configure腳本后即可用make和make install命令進行編譯安裝。
更改MiniGUI的配置文件MiniGUI.cfg設置設備驅動程序,設置顯示區域及字體等內容。修改/usr/local/etc目錄下的配置文件MiniGUI.cfg,將其中的驅動引擎gal_engine和ial_engine設置為qvfb,再將其中qvfb的defaultmode設置為合適的顯示模式。然后把qvfb加到可執行路徑中去,執行vi .bashrc命令,在 .bashrc最后面加上export PATH=/usr/local/arm/2.95.3/bin -:$PATH,保存退出后用source .bashrc命令執行一下即可。
在X Window中,打開一個終端仿真程序,執行qvfb &命令。在qvfb中選中File Configure,將qvfb設置成嵌入式開發系統的液晶屏的大小。合理設置MiniGUI的配置文件后,接著就可以運行MiniGUI應用程序了。
執行應用程序順利的話,屏幕上可以看到程序的運行界面。至此,MiniGUI已經成功移植到目標系統上。此后,我們可以根據需要,繼續修改MiniGUI庫函數及各種資源,并且編寫自己的應用程序,使圖形用戶界面更加完善。
6 結束語
隨著嵌入式產品應用領域的日益增長,開發出優秀的人機交互界面,是嵌入式發展的趨勢,擁有廣闊的市場前景。MiniGUI可以穩定可靠的運行在Linux系統下,通過上述具體的移植和后續的MiniGUI下嵌入式軟件的開發過程,能快速構建一個嵌入式可視化軟件系統,相信這種嵌入式系統將會得到越來越多的應用。
參考文獻:
[1] 北京飛漫軟件.MiniGUI用戶手冊http://www.minigui.com.
[2] Beijing Feynman Software Technology Co. Ltd.
[3] 北京恒頤高科技術有限公司. H2410EB用戶手冊http://www.hyesco.com.
[4] 祁獻鵬,郭玉東.MiniGUI-面向嵌入式系統的GUI系統[J].信息工程大學學報,2001,2(3):8-10.
[5] 李善平,劉文峰,王煥龍等.Linux與嵌入式系統[M].北京:清華大學出版社,2003.
[6] 陳雷,鐘書毅等譯. 嵌入式Linux-硬件、軟件與接口[M].北京:電子工業出版社,2003.
[7] 方寧,馬忠梅.MiniGUI在AT91RM9200開發板上的移植[J].單片機與嵌入式系統應用,2004(8):75-77.
文章版權歸西部工控xbgk所有,未經許可不得轉載。