嵌入式Linux環(huán)境下MiniGUI的研究與移植
前言
近年來隨著嵌入式設(shè)備與市場需求的廣泛結(jié)合,手機(jī)、PDA、DVD播放機(jī)等產(chǎn)品的應(yīng)用對(duì)可視化操作界面的簡潔和方便提出了更高的要求,這都需要一個(gè)穩(wěn)定可靠的高性能GUI系統(tǒng)來提供支持。圖形用戶界面(Graphic User Interface,簡稱GUI)的廣泛流行是當(dāng)今計(jì)算機(jī)技術(shù)的重要成就之一,它極大地方便了非專業(yè)用戶的使用,人們可以通過窗口、菜單方便地進(jìn)行操作。由于嵌入式系統(tǒng)實(shí)時(shí)性要求高,同時(shí)嵌入式系統(tǒng)硬件配置又有限,所以對(duì)輕型GUI的需求更加突出。另外,嵌入式系統(tǒng)往往是一種訂制設(shè)備,它們對(duì)GUI的需求也各不相同,因此GUI也必須是可訂制的。綜上所述,嵌入式系統(tǒng)對(duì)GUI的基本要求應(yīng)包括輕型、占用資源少、高性能、高可靠性以及可配置。MiniGUI 是目前比較常用的幾種GUI系統(tǒng)之一,與其他的GUI相比,MiniGUI最顯著的特點(diǎn)就是輕型、占用資源少,而且在這幾年的發(fā)展里,MiniGUI已經(jīng)非常成熟和穩(wěn)定了,在許多產(chǎn)品和項(xiàng)目中都已得到了實(shí)際應(yīng)用。
1 MiniGUI的特點(diǎn)和體系結(jié)構(gòu)
1. 1 MiniGUI的特點(diǎn)
MiniGUI是由原清華大學(xué)教師魏永明主持開發(fā)的輕量級(jí)圖形系統(tǒng),是一種面向嵌入式或?qū)崟r(shí)系統(tǒng)的圖形用戶界面支持系統(tǒng)。它遵循GPL公約,是基于SVGALib及LinuxThread庫的多窗口GUI支持系統(tǒng)。能跨多種操作系統(tǒng),主要運(yùn)行于linux及一切具有POSIX線程支持的 POSIX兼容系統(tǒng),包括普通嵌入式Linux、eCos、uC/OS-II、VxWorks等系統(tǒng),是國內(nèi)最早的自由軟件之一。
MiniGUI的主要特點(diǎn)有:
(1) 遵循GPL條款的純自由軟件;
(2) 提供了完備的多窗口機(jī)制;
(3) 多字符集和多字體支持,目前支持ISO8859-1、GB2312及Big5等字符集,并且支持各種光柵字體和TrueType、Type1等矢量字體;
(4) 全拼和五筆等漢字輸入法支持;
(5) BMP、GIF、JPEG及PCX等常見圖像文件的支持;
(6) Windows的資源文件支持,如位圖、圖標(biāo)、光標(biāo)、插入符、定時(shí)器及加速鍵等;
(7) 可移植性好。
1.2 MiniGUI的體系結(jié)構(gòu)
1.2.1多線程的分層設(shè)計(jì)
從整體結(jié)構(gòu)上看,MiniGUI是分層設(shè)計(jì)的,結(jié)構(gòu)如圖1所示。在最底層,GAL(圖形抽象層)和IAL(輸入抽象層)及鼠標(biāo)和鍵盤的驅(qū)動(dòng);中間層是MiniGUI的核心層,包括窗口系統(tǒng)必不可少的各個(gè)模塊;最頂層是API,即編程接口。GAL和IAL為MiniGUI提供了底層的Linux控制臺(tái)或者X Window上的圖形接口以及輸入接口,而Pthread用于提供內(nèi)核級(jí)線程支持的C函數(shù)庫。利用GAL和IAL,大大提高了MiniGUI的可移植性,并且使程序的開發(fā)和調(diào)試變得更加容易??梢栽赬 Window上開發(fā)和調(diào)試自己的MiniGUI程序,通過重新編譯就可以讓MiniGUI應(yīng)用程序運(yùn)行在特殊的嵌入式硬件平臺(tái)上。
MiniGUI本身運(yùn)行在多線程模式下,它的許多模塊都以單獨(dú)的線程運(yùn)行,同時(shí),MiniGUI還利用線程來支持多窗口。從本質(zhì)上講,每個(gè)線程有一個(gè)消息隊(duì)列,消息隊(duì)列是實(shí)現(xiàn)線程數(shù)據(jù)交換和同步的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)。一個(gè)線程向消息隊(duì)列中發(fā)送消息,而另一個(gè)線程從這個(gè)消息隊(duì)列中獲取消息,同一個(gè)線程中創(chuàng)建的窗口可共享同一個(gè)消息隊(duì)列。一個(gè)線程向消息隊(duì)列中發(fā)送消息,而另一個(gè)線程從這個(gè)消息隊(duì)列中獲取消息,同一個(gè)線程中創(chuàng)建的窗口可共享同一個(gè)消息隊(duì)列。利用消息隊(duì)列和多線程之間的同步機(jī)制,可以實(shí)現(xiàn)下面要講到的微客戶/服務(wù)器機(jī)制。
1.2.2微客戶/服務(wù)器結(jié)構(gòu)
在多線程環(huán)境中,與多進(jìn)程間的通訊機(jī)制類似,線程之間也有交互和同步的需求。比如, 用來管理窗口的線程維持全局的窗口列表, 而其他線程不能直接修改這些全局的數(shù)據(jù)結(jié)構(gòu), 而必須依據(jù)“先來先服務(wù)”的原則,依次處理每個(gè)線程的請(qǐng)求,這就是一般性的客戶/服務(wù)器模式。MiniGUI利用線程之間的同步操作實(shí)現(xiàn)了客戶線程和服務(wù)器線程之間的微客戶/服務(wù)器機(jī)制。
2 開發(fā)環(huán)境
H2410EB開發(fā)板由北京恒頤高科技術(shù)有限公司設(shè)計(jì)開發(fā),它基于Samsung公司的S3C2410A20嵌入式ARM處理器。 S3C2410A20內(nèi)嵌 ARM920T 核,帶有全性能的MMU,具有高性能、低功耗、低成本、小體積等優(yōu)點(diǎn),適用于手持設(shè)備、汽車等領(lǐng)域。
H2410EB除帶有大容量的SDRAM和Flash以外,還擴(kuò)展了RS-232C串行接口、10Mbps以太網(wǎng)接口、觸摸屏接口、音頻輸入/ 輸出接口、USB Host、USB Slave、UART接口、IIC接口、用戶自定義鍵盤、LCD顯示器,方便用戶使用和進(jìn)行參考設(shè)計(jì)。它支持嵌入式Linux操作系統(tǒng)的運(yùn)行,支持 MP3/MPEG播放、GUI、Web 服務(wù)及其它服務(wù),同時(shí)可根據(jù)用戶需求開發(fā)特定軟件與設(shè)備驅(qū)動(dòng)程序。
操作系統(tǒng)采用裁減后的Linux,Linux Kernel版本為v2.4.18,系統(tǒng)使用的交叉編譯器是arm-Linux-gcc。另外,還有驅(qū)動(dòng)程序源碼和測試程序源碼等代碼模塊。
3 MiniGUI的移植
本文中使用的主機(jī)系統(tǒng)為Red Hat Linux 9.0,移植目標(biāo)系統(tǒng)為Linux2.4.18,MiniGUI的版本是1.6.9。在主機(jī)上交叉編譯MiniGUI鏈接庫,然后將針對(duì)目標(biāo)機(jī)編譯的庫文件,與根文件系統(tǒng)一起燒寫到目標(biāo)板的RAM空間,以后將運(yùn)行在目標(biāo)板上的圖形用戶界面直接鏈接到該庫,脫離主機(jī)獨(dú)立運(yùn)行。
3.1 Linux交叉編譯環(huán)境的構(gòu)建
GUI的編譯通常都是在PC機(jī)上執(zhí)行的,也就是說,編譯器本身能夠在PC機(jī)上執(zhí)行,同時(shí)編譯源代碼生成的二進(jìn)制文件必須能在目標(biāo)機(jī)上執(zhí)行,這類編譯器通常稱為交叉編譯器。對(duì)于ARM平臺(tái),我們安裝了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這三個(gè)包。這些包都可以從網(wǎng)上免費(fèi)獲取。arm- binutils這個(gè)包一般包含了一些針對(duì)ARM平臺(tái)的二進(jìn)制工具,比如arm-strip、arm-ar等命令;arm-glibc這個(gè)包包含的是標(biāo)準(zhǔn) C的函數(shù)庫的ARM的版本以及對(duì)應(yīng)的頭文件;arm-gcc中包含的則是生成ARM平臺(tái)代碼的x86上的交叉編譯器。執(zhí)行rpm命令將這些包安裝到PC機(jī)上,若不在系統(tǒng)默認(rèn)搜索目錄下,則必須將安裝目錄加到系統(tǒng)的PATH環(huán)境變量中,這樣在每次編譯時(shí)系統(tǒng)才能找得到編譯器。
以root用戶登陸Linux系統(tǒng),在主機(jī)上用rpm指令安裝交叉編譯工具,arm-linux-gcc將被安裝到/usr/local /arm/2.95.3/下面。此時(shí),gcc為 /usr/local/arm/2.95.3/bin/arm-linux-gcc,而它的include為 /usr/local/arm/2.95.3/arm-linux/include,對(duì)應(yīng)的lib為 /usr/local/arm/2.95.3[!--empirenews.page--]
-/arm-linux/lib。然后,在你的bashrc 中添加環(huán)境變量即可
vi .bashrc
最后一行加入:export PATH=$PATH:/usr/local/arm/2.95.3/bin路徑
保存退出后執(zhí)行source .bashrc
另外需要注意的是,編譯時(shí)所用的函數(shù)庫版本要與目標(biāo)版上運(yùn)行時(shí)所用的函數(shù)庫版本一致。經(jīng)過上述步驟,就已經(jīng)建立了交叉編譯環(huán)境,接下來的就是進(jìn)行MiniGUI的選項(xiàng)配置和交叉編譯。
3.2 MiniGUI的配置和交叉編譯
我們可以從網(wǎng)上http://www.minigui.com/download)免費(fèi)得到MiniGUI-1.6.9的資源文件壓縮包,MiniGUI1.6.9的源程序包包括以下三個(gè)部分:
libminigui-1.6.9.tar.gz-MiniGUI函數(shù)庫源代碼;
miniguires-1.6.9.tar.gz-MiniGUI所使用的資源,包括基本字體、圖標(biāo)、位圖、輸入法等;
mde-1.6.9.tar.gz-MiniGUI的綜合演示程序。
3.2.1 配置MiniGUI選項(xiàng)
把函數(shù)庫文件包解壓:tar zxf libminigui-1.6.9.tar.gz,進(jìn)入libminigui-1.6.9這個(gè)目錄,執(zhí)行make menuconfig命令
-system wide options中選擇Build MiniGUI-Lite,并取消Use incore (built-in) resource選項(xiàng);
-Gal engine options 圖形引擎,根據(jù)目標(biāo)機(jī)的顯示方式確認(rèn),這里只勾選了 NEWGal engine on Linux FrameBuffer console,其它的不選;
-Ial engine options輸入引擎,可用觸摸屏只選了SMDK2410 Touch Screen;
-Font Options 中取消選擇Var bitmap font,可能是因?yàn)锽ug的原因,當(dāng)選擇了該選項(xiàng)后,編譯測試?yán)拥臅r(shí)候總是提示unreferenced vfb_Courier …之類的錯(cuò)誤;
-Image options選擇了Includes SaveBitmap-related functions。GIF、JPG、PNG圖形格式也勾選上;
-Development environment options 里使用Linux平臺(tái),arm-linux-gcc編譯器,安裝路徑設(shè)置在 /usr/local/arm/2.95.3/arm-linux/。
其它的用缺省選項(xiàng)就可以了,保存退出。
3.2.2 MiniGUI函數(shù)庫的安裝和編譯
進(jìn)入目錄libminigui-1.6.9,再運(yùn)行./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即為安裝到主機(jī)上的交叉編譯工具。另外,
--prefix為MiniGUI函數(shù)庫的安裝目標(biāo)路徑
--build是指執(zhí)行編譯的主機(jī)
--host交叉編譯后的程序?qū)⑦\(yùn)行的系統(tǒng)
--target是運(yùn)行該編譯器所產(chǎn)生的目標(biāo)文件的平臺(tái)
--disable-lite建立MiniGUI-Threads版本的應(yīng)用程序
--disable-micemoveable禁止窗口移動(dòng)
--disable-cursor由于系統(tǒng)采用觸摸屏,所以用此選項(xiàng)用來關(guān)閉鼠標(biāo)光標(biāo)顯示
如果運(yùn)行./configure腳本成功通過,就可繼續(xù)進(jìn)行下面的編譯了,執(zhí)行make和make install命令編譯安裝libminigui。這里要注意的是,執(zhí)行make install命令時(shí)要切換到Root用戶權(quán)限下,不然安裝時(shí)沒法把文件裝到指定目錄下。安裝成功后,MiniGUI 的函數(shù)庫和頭文件以及配置文件等資源將被安裝到/usr/local/arm/2.95.3/arm-linux/目錄中,具體情況為:函數(shù)庫被裝在 lib/ 子目錄中;頭文件被裝在include/ 子目錄中;手冊(cè)被裝在man/ 子目錄中;配置文件被裝在etc/ 子目錄中。
3.2.3 MiniGUI資源的編譯安裝
主機(jī)上解壓資源文件:tar zxf miniguires-1.6.9.tar.gz,可生成miniguires-1.6.9目錄。在安裝之前先要修改目錄中的 configure.linux文件,執(zhí)行vi configure.linux打開文件,把prefix選項(xiàng)部分的默認(rèn)值 /usr/local/ 改為 /usr/local/arm/2.95.3/arm-linux/,這樣運(yùn)行make install安裝命令后MiniGUI資源將被安裝到目標(biāo)系統(tǒng)中的/usr/local/arm/2.95.3/arm-linux/lib /minigui-
/res的目錄下。
3.2.4 實(shí)例程序的編譯安裝
解壓mde-1.6.9.tar.gz并進(jìn)入該目錄,修改目錄下配置文件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),來指定交叉編譯時(shí)搜minigui的頭文件路徑,防止編譯時(shí)系統(tǒng)找不到頭文件;在所有LIB="$LIB后加入–L{prefix}/lib來指定編譯時(shí)所需要庫文件的路徑。并將libpopt-dev-arm- cross-1.6.tgz解壓所生成的頭文件和庫文件分別放入目標(biāo)目錄的include和lib中,用以支持mde中程序在ARM下的交叉編譯。
然后執(zhí)行./autogen.sh,重新生成configure腳本,使用上面配置的腳本然后執(zhí)行make命令,即可完成實(shí)例程序的編譯。
4 拷貝MiniGUI資源到開發(fā)板
編譯完MiniGUI和實(shí)例程序之后,需要把MiniGUI庫、資源和應(yīng)用程序拷貝到為目標(biāo)機(jī)器準(zhǔn)備的文件系統(tǒng)目錄中,然后生成文件系統(tǒng)映像,再下載到目標(biāo)板上運(yùn)行??梢酝ㄟ^串口、USB口或以太網(wǎng)口將文件系統(tǒng)映像下載到目標(biāo)機(jī)器中。如果發(fā)現(xiàn)子目錄lib 中的MiniGUI 庫文件很大,很難全部拷貝到開發(fā)板上的話,可以對(duì)庫文件執(zhí)行arm-linux-strip操作,arm-linux-strip指令會(huì)除去文件中的調(diào)試信息,使文件體積大大縮小。另外需要注意的是,有些庫函數(shù)是鏈接文件,如果單純的拷貝,會(huì)將原先的鏈接信息丟失,造成不必要的麻煩。使用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目錄下的可執(zhí)行程序。將這些資源燒寫進(jìn)ramdisk文件系統(tǒng)中,解壓后將 MiniGUI的配置文件MiniGUI.cfg放入/usr/local/etc目錄中,MiniGUI的庫文件放入/usr/local/lib目錄中。在執(zhí)行程序之前,還有一件重要的事情要做,就是在開發(fā)板上的Linux中配置好MiniGUI的運(yùn)行環(huán)境。
5板載Linux的環(huán)境配置
MiniGUI可以使用多種圖形引擎進(jìn)行圖像顯示,有qvfb、SVGALib、LibGGI等等,當(dāng)然也可以自己編寫一個(gè)圖形引擎供 MiniGUI使用。這里我們使用qvfb來作為MiniGUI的圖形引擎進(jìn)行圖像顯示。qvfb(vitural framebuffer)是在宿主機(jī)上模擬幀緩沖的,它是X Window用來運(yùn)行和測試應(yīng)用程序的系統(tǒng)程序,允許我們?cè)谧烂婕捌渖祥_發(fā)Qt嵌入式程序,而不需要在命令臺(tái)和程序之間來回切換。qvfb使用了共享存儲(chǔ)區(qū)域(虛擬的幀緩沖)來模擬幀緩沖并且在一個(gè)窗口中(qvfb)模擬一個(gè)應(yīng)用來顯示幀緩沖,顯示的區(qū)域被周期性的改變和更新。通過指定顯示設(shè)備的寬度和顏色深度,虛擬出來的緩沖幀和物理的顯示設(shè)備在每個(gè)像素上保持一致。這樣我們?cè)诿看握{(diào)試應(yīng)用時(shí)不需要總是刷新嵌入式設(shè)備的FLASH存儲(chǔ)空間,從而加速了應(yīng)用的編譯、連接和運(yùn)行周期。[!--empirenews.page--]
首先對(duì)qvfb進(jìn)行安裝,可以從這里下載http://www.minigui.com/downloads/dep-libs/qvfb
-1.0.tar.gz),下載下來后進(jìn)行解壓:tar zxf qvfb-1.0.tar.gz并進(jìn)入到qvfb-1.0目錄,執(zhí)行./configure腳本后即可用make和make install命令進(jìn)行編譯安裝。
更改MiniGUI的配置文件MiniGUI.cfg設(shè)置設(shè)備驅(qū)動(dòng)程序,設(shè)置顯示區(qū)域及字體等內(nèi)容。修改/usr/local/etc目錄下的配置文件MiniGUI.cfg,將其中的驅(qū)動(dòng)引擎gal_engine和ial_engine設(shè)置為qvfb,再將其中qvfb的 defaultmode設(shè)置為合適的顯示模式。然后把qvfb加到可執(zhí)行路徑中去,執(zhí)行vi .bashrc命令,在 .bashrc最后面加上export PATH=/usr/local/arm/2.95.3/bin -:$PATH,保存退出后用source .bashrc命令執(zhí)行一下即可。
在X Window中,打開一個(gè)終端仿真程序,執(zhí)行qvfb &命令。在qvfb中選中File Configure,將qvfb設(shè)置成嵌入式開發(fā)系統(tǒng)的液晶屏的大小。合理設(shè)置MiniGUI的配置文件后,接著就可以運(yùn)行MiniGUI應(yīng)用程序了。
執(zhí)行應(yīng)用程序順利的話,屏幕上可以看到程序的運(yùn)行界面。至此,MiniGUI已經(jīng)成功移植到目標(biāo)系統(tǒng)上。此后,我們可以根據(jù)需要,繼續(xù)修改MiniGUI庫函數(shù)及各種資源,并且編寫自己的應(yīng)用程序,使圖形用戶界面更加完善。
6 結(jié)束語
隨著嵌入式產(chǎn)品應(yīng)用領(lǐng)域的日益增長,開發(fā)出優(yōu)秀的人機(jī)交互界面,是嵌入式發(fā)展的趨勢(shì),擁有廣闊的市場前景。MiniGUI可以穩(wěn)定可靠的運(yùn)行在 Linux系統(tǒng)下,通過上述具體的移植和后續(xù)的MiniGUI下嵌入式軟件的開發(fā)過程,能快速構(gòu)建一個(gè)嵌入式可視化軟件系統(tǒng),相信這種嵌入式系統(tǒng)將會(huì)得到越來越多的應(yīng)用。