-- 嵌入式Linux環境下MiniGUI的研究與移植 前言
近年來隨著嵌入式裝置與市場需求的廣泛結合,手機、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) 全拼和五筆等漢字IME支援;
(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所使用的資源,包括基本字型、表徵圖、位元影像、IME等;
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下嵌入式軟體的開發過程,能快速構建一個嵌入式可視化軟體系統,相信這種嵌入式系統將會得到越來越多的應用。