近幾年,嵌入式 Linux 系統(tǒng)已得到廣泛的應用,相應的圖形用戶界面的開發(fā)也日趨重要,MiniGUI正是其中的一個輕量級的圖形用戶界面支持系統(tǒng)。本文分析了嵌入式操作系統(tǒng)下圖形用戶界面MiniGUI 的結構和特點,描述了將MiniGUI在ARM Linux下的移植方法與過程,并對這種基于MiniGUI的嵌入式系統(tǒng)開發(fā)做了展望。
0前言
近年來隨著嵌入式設備與市場需求的廣泛結合,手機、PDA等產(chǎn)品的應用對可視化操作界面的簡潔和方便提出了更高的要求,這都需要一個穩(wěn)定可靠的高性能GUI系統(tǒng)來提供支持。圖形用戶界面(Graphic User Interface,簡稱GUI)的廣泛流行是當今計算機技術的重要成就之一,它極大地方便了非專業(yè)用戶的使用,人們可以通過窗口、菜單方便地進行操作。嵌入式系統(tǒng)對GUI的基本要求包括有輕型、占用資源少、高性能、高可靠性以及可配置等。MiniGUI是目前比較常用的幾種GUI系統(tǒng)之一,與其他的GUI相比,MiniGUI最顯著的特點就是輕型、占用資源少,而且在這幾年的發(fā)展里,MiniGUI已經(jīng)非常成熟和穩(wěn)定了,在許多產(chǎn)品和項目中都已得到了實際應用。
1 MiniGUI的特點和體系結構
1. 1 MiniGUI的特點
MiniGUI是由原清華大學教師魏永明主持開發(fā)的輕量級圖形系統(tǒng),是一種面向嵌入式或?qū)崟r系統(tǒng)的圖形用戶界面支持系統(tǒng)。它遵循GPL公約,是基于SVGALib及LinuxThread庫的多窗口GUI支持系統(tǒng)。能跨多種操作系統(tǒng),主要運行于linux及一切具有POSIX線程支持的POSIX兼容系統(tǒng),包括普通嵌入式Linux、eCos、uC/OS-II、VxWorks等系統(tǒng),是國內(nèi)最早的自由軟件之一。
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(輸入抽象層)及鼠標和鍵盤的驅(qū)動;中間層是MiniGUI的核心層,包括窗口系統(tǒng)必不可少的各個模塊;最頂層是API,即編程接口。GAL和IAL為MiniGUI提供了底層的Linux控制臺或者X Window上的圖形接口以及輸入接口,而Pthread用于提供內(nèi)核級線程支持的C函數(shù)庫。利用GAL和IAL,大大提高了MiniGUI的可移植性,并且使程序的開發(fā)和調(diào)試變得更加容易。
MiniGUI本身運行在多線程模式下,它的許多模塊都以單獨的線程運行,同時,MiniGUI還利用線程來支持多窗口。從本質(zhì)上講,每個線程有一個消息隊列,消息隊列是實現(xiàn)線程數(shù)據(jù)交換和同步的關鍵數(shù)據(jù)結構。一個線程向消息隊列中發(fā)送消息,而另一個線程從這個消息隊列中獲取消息,同一個線程中創(chuàng)建的窗口可共享同一個消息隊列。一個線程向消息隊列中發(fā)送消息,而另一個線程從這個消息隊列中獲取消息,同一個線程中創(chuàng)建的窗口可共享同一個消息隊列。利用消息隊列和多線程之間的同步機制,可以實現(xiàn)下面要講到的微客戶/服務器機制。
1.2.2微客戶/服務器結構
在多線程環(huán)境中,與多進程間的通訊機制類似,線程之間也有交互和同步的需求。比如, 用來管理窗口的線程維持全局的窗口列表, 而其他線程不能直接修改這些全局的數(shù)據(jù)結構, 而必須依據(jù)“先來先服務”的原則,依次處理每個線程的請求,這就是一般性的客戶/服務器模式。MiniGUI利用線程之間的同步操作實現(xiàn)了客戶線程和服務器線程之間的微客戶/服務器機制。
2開發(fā)環(huán)境
H2410EB開發(fā)板由北京恒頤高科技術有限公司設計開發(fā),它基于Samsung公司的S3C2410A20嵌入式ARM處理器。S3C2410A20內(nèi)嵌 ARM920T 核,帶有全性能的MMU,具有高性能、低功耗、低成本、小體積等優(yōu)點,適用于手持設備、汽車等領域。
H2410EB除帶有大容量的SDRAM和Flash以外,還擴展了RS-232C串行接口、10Mbps以太網(wǎng)接口、觸摸屏接口、音頻輸入/輸出接口、USB Host、USB Slave、UART接口、IIC接口、用戶自定義鍵盤、LCD顯示器,方便用戶使用和進行參考設計。它支持嵌入式Linux操作系統(tǒng)的運行,支持MP3/MPEG播放、GUI、Web 服務及其它服務,同時可根據(jù)用戶需求開發(fā)特定軟件與設備驅(qū)動程序。
操作系統(tǒng)采用裁減后的Linux,Linux Kernel版本為v2.4.18,系統(tǒng)使用的交叉編譯器是arm-Linux-gcc。另外,還有驅(qū)動程序源碼和測試程序源碼等代碼模塊。
3 MiniGUI的移植
本文中使用的主機系統(tǒng)為Red Hat Linux 9.0,移植目標系統(tǒng)為Linux2.4.18,MiniGUI的版本是1.6.9。在主機上交叉編譯MiniGUI鏈接庫,然后將針對目標機編譯的庫文件,與根文件系統(tǒng)一起燒寫到目標板的RAM空間,以后將運行在目標板上的圖形用戶界面直接鏈接到該庫,脫離主機獨立運行。
3.1 Linux交叉編譯環(huán)境的構建
GUI的編譯通常都是在PC機上執(zhí)行的,也就是說,編譯器本身能夠在PC機上執(zhí)行,同時編譯源代碼生成的二進制文件必須能在目標機上執(zhí)行,這類編譯器通常稱為交叉編譯器。對于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這三個包。這些包都可以從網(wǎng)上免費獲取。arm-binutils這個包一般包含了一些針對ARM平臺的二進制工具,比如arm-strip、arm-ar等命令;arm-glibc這個包包含的是標準C的函數(shù)庫的ARM的版本以及對應的頭文件;arm-gcc中包含的則是生成ARM平臺代碼的x86上的交叉編譯器。執(zhí)行rpm命令將這些包安裝到PC機上,若不在系統(tǒng)默認搜索目錄下,則必須將安裝目錄加到系統(tǒng)的PATH環(huán)境變量中,這樣在每次編譯時系統(tǒng)才能找得到編譯器。
以root用戶登陸Linux系統(tǒng),在主機上用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 中添加環(huán)境變量即可。執(zhí)行vi .bashrc,最后一行加入:export PATH=$PATH:/usr/local/arm/2.95.3/bin路徑,保存退出后執(zhí)行source .bashrc。
另外需要注意的是,編譯時所用的函數(shù)庫版本要與目標版上運行時所用的函數(shù)庫版本一致。經(jīng)過上述步驟,就已經(jīng)建立了交叉編譯環(huán)境,接下來的就是進行MiniGUI的選項配置和交叉編譯。
3.2 MiniGUI的配置和交叉編譯
我們可以從網(wǎng)上免費得到MiniGUI-1.6.9的資源文件壓縮包,MiniGUI1.6.9的源程序包包括以下三個部分:libminigui-1.6.9.tar.gz-MiniGUI函數(shù)庫源代碼;miniguires-1.6.9.tar.gz-MiniGUI所使用的資源,包括基本字體、圖標、位圖、輸入法等;mde-1.6.9.tar.gz-MiniGUI的綜合演示程序。
3.2.1 MiniGUI函數(shù)庫的安裝和編譯
進入目錄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函數(shù)庫的安裝目標路徑;--build是指執(zhí)行編譯的主機;--h(huán)ost交叉編譯后的程序?qū)⑦\行的系統(tǒng);--target是運行該編譯器所產(chǎn)生的目標文件的平臺;--disable-lite建立MiniGUI-Threads版本的應用程序;--disable-micemoveable禁止窗口移動;--disable-cursor由于系統(tǒng)采用觸摸屏,所以用此選項用來關閉鼠標光標顯示。
如果運行。/configure腳本成功通過,就可繼續(xù)進行下面的編譯了,執(zhí)行make和make install命令編譯安裝libminigui。這里要注意的是,執(zhí)行make install命令時要切換到Root用戶權限下,不然安裝時沒法把文件裝到指定目錄下。安裝成功后,MiniGUI 的函數(shù)庫和頭文件以及配置文件等資源將被安裝到/usr/local/arm/2.95.3/arm-linux/目錄中,具體情況為:函數(shù)庫被裝在lib/ 子目錄中;頭文件被裝在include/ 子目錄中;手冊被裝在man/ 子目錄中;配置文件被裝在etc/ 子目錄中。
3.2.2 MiniGUI資源的編譯安裝
主機上解壓資源文件:tar zxf miniguires-1.6.9.tar.gz,可生成miniguires-1.6.9目錄。在安裝之前先要修改目錄中的configure.linux文件,執(zhí)行vi configure.linux打開文件,把prefix選項部分的默認值 /usr/local/ 改為 /usr/local/arm/2.95.3/arm-linux/,這樣運行make install安裝命令后MiniGUI資源將被安裝到目標系統(tǒng)中的/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的頭文件路徑,防止編譯時系統(tǒng)找不到頭文件;在所有LIB=“$LIB后加入–L{prefix}/lib來指定編譯時所需要庫文件的路徑。并將libpopt-dev-arm-cross-1.6.tgz解壓所生成的頭文件和庫文件分別放入目標目錄的include和lib中,用以支持mde中程序在ARM下的交叉編譯。然后執(zhí)行。/autogen.sh,重新生成configure腳本,使用上面配置的腳本然后執(zhí)行make命令,即可完成實例程序的編譯。
4拷貝MiniGUI資源到開發(fā)板
編譯完MiniGUI和實例程序之后,需要把MiniGUI庫、資源和應用程序拷貝到為目標機器準備的文件系統(tǒng)目錄中,然后生成文件系統(tǒng)映像,再下載到目標板上運行??梢酝ㄟ^串口、USB口或以太網(wǎng)口將文件系統(tǒng)映像下載到目標機器中。在執(zhí)行程序之前,還有一件重要的事情要做,就是在開發(fā)板上的Linux中配置好MiniGUI的運行環(huán)境。
5板載Linux的環(huán)境配置
MiniGUI可以使用多種圖形引擎進行圖像顯示,有qvfb、SVGALib、LibGGI等等,當然也可以自己編寫一個圖形引擎供MiniGUI使用。這里我們使用qvfb來作為MiniGUI的圖形引擎進行圖像顯示。qvfb(vitural framebuffer)是在宿主機上模擬幀緩沖的,它是X Window用來運行和測試應用程序的系統(tǒng)程序,使用了共享存儲區(qū)域(虛擬的幀緩沖)來模擬幀緩沖并且在一個窗口中模擬一個應用來顯示幀緩沖。
首先對qvfb進行安裝,可以從網(wǎng)上下載,下載下來后進行解壓:tar zxf qvfb-1.0.tar.gz并進入到qvfb-1.0目錄,執(zhí)行。/configure腳本后即可用make和make install命令進行編譯安裝。
更改MiniGUI的配置文件MiniGUI.cfg設置設備驅(qū)動程序,設置顯示區(qū)域及字體等內(nèi)容。修改/usr/local/etc目錄下的配置文件MiniGUI.cfg,將其中的驅(qū)動引擎gal_engine和ial_engine設置為qvfb,再將其中qvfb的defaultmode設置為合適的顯示模式。然后把qvfb加到可執(zhí)行路徑中去,執(zhí)行vi .bashrc命令,在 .bashrc最后面加上export PATH=/usr/local/arm/2.95.3/bin -:$PATH,保存退出后用source .bashrc命令執(zhí)行一下即可。
在X Window中,打開一個終端仿真程序,執(zhí)行qvfb &命令。在qvfb中選中File Configure,將qvfb設置成嵌入式開發(fā)系統(tǒng)的液晶屏的大小。合理設置MiniGUI的配置文件后,接著就可以運行MiniGUI應用程序了。
執(zhí)行應用程序順利的話,屏幕上可以看到程序的運行界面。至此,MiniGUI已經(jīng)成功移植到目標系統(tǒng)上。此后,我們可以根據(jù)需要,繼續(xù)修改MiniGUI庫函數(shù)及各種資源,并且編寫自己的應用程序,使圖形用戶界面更加完善。
6結束語
隨著嵌入式產(chǎn)品應用領域的日益增長,開發(fā)出優(yōu)秀的人機交互界面,是嵌入式發(fā)展的趨勢,擁有廣闊的市場前景。MiniGUI可以穩(wěn)定可靠的運行在Linux系統(tǒng)下,通過上述具體的移植和后續(xù)的MiniGUI下嵌入式軟件的開發(fā)過程,能快速構建一個嵌入式可視化軟件系統(tǒng),相信這種嵌入式系統(tǒng)將會得到越來越多的應用。
評論
查看更多