siemens x
I/O 設(shè)備

嵌入式 Linux 環(huán)境下MiniGUI 的研究與移植

2025China.cn   2009年08月31日

摘 要:近幾年,嵌入式 Linux 系統(tǒng)已得到廣泛的應(yīng)用,相應(yīng)的圖形用戶界面的開發(fā)也日趨重要,MiniGUI正是其中的一個(gè)輕量級(jí)的圖形用戶界面支持系統(tǒng)。本文分析了嵌入式操作系統(tǒng)下圖形用戶界面MiniGUI 的結(jié)構(gòu)和特點(diǎn),描述了將MiniGUI在ARM Linux下的移植方法與過(guò)程,并對(duì)這種基于MiniGUI的嵌入式系統(tǒng)開發(fā)做了展望。
關(guān)鍵詞:嵌入式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 前言
      近年來(lái)隨著嵌入式設(shè)備與市場(chǎng)需求的廣泛結(jié)合,手機(jī)、PDA、DVD播放機(jī)等產(chǎn)品的應(yīng)用對(duì)可視化操作界面的簡(jiǎn)潔和方便提出了更高的要求,這都需要一個(gè)穩(wěn)定可靠的高性能GUI系統(tǒng)來(lái)提供支持。圖形用戶界面(Graphic User Interface,簡(jiǎn)稱GUI)的廣泛流行是當(dāng)今計(jì)算機(jī)技術(shù)的重要成就之一,它極大地方便了非專業(yè)用戶的使用,人們可以通過(guò)窗口、菜單方便地進(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庫(kù)的多窗口GUI支持系統(tǒng)。能跨多種操作系統(tǒng),主要運(yùn)行于linux及一切具有POSIX線程支持的POSIX兼容系統(tǒng),包括普通嵌入式Linux、eCos、uC/OS-II、VxWorks等系統(tǒng),是國(guó)內(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ù)庫(kù)。利用GAL和IAL,大大提高了MiniGUI的可移植性,并且使程序的開發(fā)和調(diào)試變得更加容易。可以在X Window上開發(fā)和調(diào)試自己的MiniGUI程序,通過(guò)重新編譯就可以讓MiniGUI應(yīng)用程序運(yùn)行在特殊的嵌入式硬件平臺(tái)上。
      MiniGUI本身運(yùn)行在多線程模式下,它的許多模塊都以單獨(dú)的線程運(yùn)行,同時(shí),MiniGUI還利用線程來(lái)支持多窗口。從本質(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ī)制類似,線程之間也有交互和同步的需求。比如, 用來(lái)管理窗口的線程維持全局的窗口列表, 而其他線程不能直接修改這些全局的數(shù)據(jù)結(jié)構(gòu), 而必須依據(jù)“先來(lái)先服務(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)程序源碼和測(cè)試程序源碼等代碼模塊。
3  MiniGUI的移植
      本文中使用的主機(jī)系統(tǒng)為Red Hat Linux 9.0,移植目標(biāo)系統(tǒng)為L(zhǎng)inux2.4.18,MiniGUI的版本是1.6.9。在主機(jī)上交叉編譯MiniGUI鏈接庫(kù),然后將針對(duì)目標(biāo)機(jī)編譯的庫(kù)文件,與根文件系統(tǒng)一起燒寫到目標(biāo)板的RAM空間,以后將運(yùn)行在目標(biāo)板上的圖形用戶界面直接鏈接到該庫(kù),脫離主機(jī)獨(dú)立運(yùn)行。
    3.1 Linux交叉編譯環(huán)境的構(gòu)建
      GUI的編譯通常都是在PC機(jī)上執(zhí)行的,也就是說(shuō),編譯器本身能夠在PC機(jī)上執(zhí)行,同時(shí)編譯源代碼生成的二進(jìn)制文件必須能在目標(biāo)機(jī)上執(zhí)行,這類編譯器通常稱為交叉編譯器。對(duì)于ARM平臺(tái),我們安裝了、cross-arm-gcc-2.95.3
、這三個(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ù)庫(kù)的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
-/arm-linux/lib。然后,在你的bashrc 中添加環(huán)境變量即可
vi .bashrc
      最后一行加入:export PATH=$PATH:/usr/local/arm/2.95.3/bin路徑
保存退出后執(zhí)行source .bashrc
      另外需要注意的是,編譯時(shí)所用的函數(shù)庫(kù)版本要與目標(biāo)版上運(yùn)行時(shí)所用的函數(shù)庫(kù)版本一致。經(jīng)過(guò)上述步驟,就已經(jīng)建立了交叉編譯環(huán)境,接下來(lái)的就是進(jìn)行MiniGUI的選項(xiàng)配置和交叉編譯。
    3.2 MiniGUI的配置和交叉編譯
      我們可以從網(wǎng)上
)免費(fèi)得到MiniGUI-1.6.9的資源文件壓縮包,MiniGUI1.6.9的源程序包包括以下三個(gè)部分:
-MiniGUI函數(shù)庫(kù)源代碼;
-MiniGUI所使用的資源,包括基本字體、圖標(biāo)、位圖、輸入法等;
      -MiniGUI的綜合演示程序。
    3.2.1 配置MiniGUI選項(xiàng)
  把函數(shù)庫(kù)文件包解壓:tar zxf ,進(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)后,編譯測(cè)試?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ù)庫(kù)的安裝和編譯
      進(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是用來(lái)指定所使用的編譯器,arm-linux-gcc即為安裝到主機(jī)上的交叉編譯工具。另外,
--prefix為MiniGUI函數(shù)庫(kù)的安裝目標(biāo)路徑
--build是指執(zhí)行編譯的主機(jī)
--h(huán)ost交叉編譯后的程序?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)用來(lái)關(guān)閉鼠標(biāo)光標(biāo)顯示
如果運(yùn)行./configure腳本成功通過(guò),就可繼續(xù)進(jìn)行下面的編譯了,執(zhí)行make和make install命令編譯安裝libminigui。這里要注意的是,執(zhí)行make install命令時(shí)要切換到Root用戶權(quán)限下,不然安裝時(shí)沒(méi)法把文件裝到指定目錄下。安裝成功后,MiniGUI 的函數(shù)庫(kù)和頭文件以及配置文件等資源將被安裝到/usr/local/arm/2.95.3/arm-linux/目錄中,具體情況為:函數(shù)庫(kù)被裝在lib/ 子目錄中;頭文件被裝在include/ 子目錄中;手冊(cè)被裝在man/ 子目錄中;配置文件被裝在etc/ 子目錄中。
    3.2.3 MiniGUI資源的編譯安裝
      主機(jī)上解壓資源文件:tar zxf ,可生成miniguires-1.6.9目錄。在安裝之前先要修改目錄中的文件,執(zhí)行vi 打開文件,把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í)例程序的編譯安裝
      解壓并進(jìn)入該目錄,修改目錄下配置文件,把其中的AC_CHECK_HEADERS(minigui/commmon.h, have_libminigui=yes, foo=bar)改為
AC_CHECK_HEADERS($prefix/include/minigui/common.h,have_libminigui=yes,foo=bar),來(lái)指定交叉編譯時(shí)搜minigui的頭文件路徑,防止編譯時(shí)系統(tǒng)找不到頭文件;在所有LIB="$LIB后加入–L{prefix}/lib來(lái)指定編譯時(shí)所需要庫(kù)文件的路徑。并將解壓所生成的頭文件和庫(kù)文件分別放入目標(biāo)目錄的include和lib中,用以支持mde中程序在ARM下的交叉編譯。
      然后執(zhí)行./,重新生成configure腳本,使用上面配置的腳本然后執(zhí)行make命令,即可完成實(shí)例程序的編譯。
4 拷貝MiniGUI資源到開發(fā)板
      編譯完MiniGUI和實(shí)例程序之后,需要把MiniGUI庫(kù)、資源和應(yīng)用程序拷貝到為目標(biāo)機(jī)器準(zhǔn)備的文件系統(tǒng)目錄中,然后生成文件系統(tǒng)映像,再下載到目標(biāo)板上運(yùn)行。可以通過(guò)串口、USB口或以太網(wǎng)口將文件系統(tǒng)映像下載到目標(biāo)機(jī)器中。如果發(fā)現(xiàn)子目錄lib 中的MiniGUI 庫(kù)文件很大,很難全部拷貝到開發(fā)板上的話,可以對(duì)庫(kù)文件執(zhí)行arm-linux-strip操作,arm-linux-strip指令會(huì)除去文件中的調(diào)試信息,使文件體積大大縮小。另外需要注意的是,有些庫(kù)函數(shù)是鏈接文件,如果單純的拷貝,會(huì)將原先的鏈接信息丟失,造成不必要的麻煩。使用tar命令將所需拷貝的資源打包,其中包括etc子目錄下的配置文件;lib 子目錄下的.0.0、.0.0、.0.0和minigui子目錄;mde-1.6.9目錄下的可執(zhí)行程序。將這些資源燒寫進(jìn)ramdisk文件系統(tǒng)中,解壓后將MiniGUI的配置文件放入/usr/local/etc目錄中,MiniGUI的庫(kù)文件放入/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來(lái)作為MiniGUI的圖形引擎進(jìn)行圖像顯示。qvfb(vitural framebuffer)是在宿主機(jī)上模擬幀緩沖的,它是X Window用來(lái)運(yùn)行和測(cè)試應(yīng)用程序的系統(tǒng)程序,允許我們?cè)谧烂婕捌渖祥_發(fā)Qt嵌入式程序,而不需要在命令臺(tái)和程序之間來(lái)回切換。qvfb使用了共享存儲(chǔ)區(qū)域(虛擬的幀緩沖)來(lái)模擬幀緩沖并且在一個(gè)窗口中(qvfb)模擬一個(gè)應(yīng)用來(lái)顯示幀緩沖,顯示的區(qū)域被周期性的改變和更新。通過(guò)指定顯示設(shè)備的寬度和顏色深度,虛擬出來(lái)的緩沖幀和物理的顯示設(shè)備在每個(gè)像素上保持一致。這樣我們?cè)诿看握{(diào)試應(yīng)用時(shí)不需要總是刷新嵌入式設(shè)備的FLASH存儲(chǔ)空間,從而加速了應(yīng)用的編譯、連接和運(yùn)行周期。
      首先對(duì)qvfb進(jìn)行安裝,可以從這里下載

),下載下來(lái)后進(jìn)行解壓:tar zxf 并進(jìn)入到qvfb-1.0目錄,執(zhí)行./configure腳本后即可用make和make install命令進(jìn)行編譯安裝。
更改MiniGUI的配置文件設(shè)置設(shè)備驅(qū)動(dòng)程序,設(shè)置顯示區(qū)域及字體等內(nèi)容。修改/usr/local/etc目錄下的配置文件,將其中的驅(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庫(kù)函數(shù)及各種資源,并且編寫自己的應(yīng)用程序,使圖形用戶界面更加完善。
6 結(jié)束語(yǔ)
  隨著嵌入式產(chǎn)品應(yīng)用領(lǐng)域的日益增長(zhǎng),開發(fā)出優(yōu)秀的人機(jī)交互界面,是嵌入式發(fā)展的趨勢(shì),擁有廣闊的市場(chǎng)前景。MiniGUI可以穩(wěn)定可靠的運(yùn)行在Linux系統(tǒng)下,通過(guò)上述具體的移植和后續(xù)的MiniGUI下嵌入式軟件的開發(fā)過(guò)程,能快速構(gòu)建一個(gè)嵌入式可視化軟件系統(tǒng),相信這種嵌入式系統(tǒng)將會(huì)得到越來(lái)越多的應(yīng)用。
參考文獻(xiàn):
[1] 北京飛漫軟件.MiniGUI用戶手冊(cè)
.
[2] Beijing Feynman Software Technology Co. Ltd.
[3] 北京恒頤高科技術(shù)有限公司. H2410EB用戶手冊(cè)
.
[4] 祁獻(xiàn)鵬,郭玉東.MiniGUI-面向嵌入式系統(tǒng)的GUI系統(tǒng)[J].信息工程大學(xué)學(xué)報(bào),2001,2(3):8-10.
[5] 李善平,劉文峰,王煥龍等.Linux與嵌入式系統(tǒng)[M].北京:清華大學(xué)出版社,2003.
[6] 陳雷,鐘書毅等譯. 嵌入式Linux-硬件、軟件與接口[M].北京:電子工業(yè)出版社,2003.
[7] 方寧,馬忠梅.MiniGUI在AT91RM9200開發(fā)板上的移植[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2004(8):75-77.

 

 

(轉(zhuǎn)載)

標(biāo)簽:嵌入式 我要反饋 
2024世界人工智能大會(huì)專題
即刻點(diǎn)擊并下載ABB資料,好禮贏不停~
優(yōu)傲機(jī)器人下載中心
西克
2024全景工博會(huì)
專題報(bào)道