《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于ARM LINUX的嵌入式GUI的研究和移植
基于ARM LINUX的嵌入式GUI的研究和移植
摘要: 隨著嵌入式系統(tǒng)的發(fā)展,用戶對嵌入式系統(tǒng)的要求越來越高,因此用于實(shí)現(xiàn)與用戶交流功能的嵌入式GUI成為嵌入式研究中的一個(gè)重點(diǎn)。該文首先介紹了什么是嵌入式系統(tǒng)和嵌入式系統(tǒng)中的GUI,并闡述了開發(fā)基于嵌入式Linux平臺的GUI系統(tǒng)的必要性。然后詳細(xì)的介紹了三種常見的嵌入式GUI系統(tǒng)(Microwindows、MiniGUI和QT)的設(shè)計(jì)結(jié)構(gòu)和使用上的優(yōu)缺點(diǎn)等,并列表進(jìn)行了比較。最后,描述了每個(gè)系統(tǒng)基于ARMLinux平臺的移植,包括編譯環(huán)境的建立、編
關(guān)鍵詞: 軟件 ARM GUI 嵌入式
Abstract:
Key words :

引言

什么是嵌入式系統(tǒng)

嵌入式系統(tǒng)一般指以嵌入式微處理器為核心,有別于PC系統(tǒng),有計(jì)算機(jī)的部分功能但又不稱之為計(jì)算機(jī)的設(shè)備或器材。它主要是以應(yīng)用為目的,系統(tǒng)軟硬件于一體,通常要求具有代碼小、響應(yīng)速度快、可靠性高、低功耗、集成度高等特點(diǎn)。嵌入式系統(tǒng)遍布于各個(gè)行業(yè)以及人們的日常生活當(dāng)中,比如掌上PDA、移動(dòng)計(jì)算設(shè)備、電視機(jī)頂盒、手機(jī)、汽車、數(shù)字相機(jī)、家庭自動(dòng)化系統(tǒng)、安全系統(tǒng)、自動(dòng)售貨機(jī)、工業(yè)自動(dòng)化儀表與醫(yī)療儀器等。

什么是嵌入式系統(tǒng)中的GUI

隨著后PC時(shí)代的到來,嵌入式系統(tǒng)的性能有了大幅度的提高,應(yīng)用范圍也越來越廣,當(dāng)初的一些簡單的人機(jī)交互接口已經(jīng)無法滿足人們的要求。而與此同時(shí),在臺式PC機(jī)上圖形交互界面早已普及并成熟,于是在嵌入式系統(tǒng)中也逐漸出現(xiàn)了圖形用戶界面(GraphicUserInterface,GUI),特別是在一些消費(fèi)類產(chǎn)品中。嵌入式系統(tǒng)中的GUI就是在嵌入式系統(tǒng)中為特定的硬件設(shè)備或環(huán)境而設(shè)計(jì)的圖形用戶界面系統(tǒng)。由于受到當(dāng)前嵌入式系統(tǒng)本身特點(diǎn)的影響,并受其發(fā)展限制,所以嵌入式系統(tǒng)中的GUI應(yīng)該有如下特點(diǎn):

占用的存儲(chǔ)空間以及運(yùn)行時(shí)占用資源少;運(yùn)行速度以及響應(yīng)速度快;可靠性高;便于移植和定制。

Linux有開放的源碼、高效穩(wěn)定的內(nèi)核、良好的開發(fā)環(huán)境以及支持多種硬件平臺等特點(diǎn),而且由于Linux的可配置性和可模塊化,一個(gè)Linux內(nèi)核經(jīng)過配置和裁減可以只占用幾百K左右的存儲(chǔ)空間,使其在嵌入式系統(tǒng)中也得到廣泛應(yīng)用。然而,在嵌入式系統(tǒng)中有嚴(yán)格的資源限制,臺式機(jī)Linux平臺下成熟的GUI無法直接移植到嵌入式設(shè)備上。因此,嵌入式系統(tǒng)中基于Linux的GUI愈發(fā)成為開發(fā)基于Linux的嵌入式系統(tǒng)所必須面對的問題。目前,隨著嵌入式行業(yè)分工的細(xì)化,出現(xiàn)了專門的公司致力開發(fā)Linux下的GUI并給其它公司提供授權(quán),從而縮短了嵌入式系統(tǒng)的開發(fā)周期。本文就旨在于對這樣的幾種嵌入式GUI進(jìn)行研究,列出表1進(jìn)行比較,并介紹這幾種GUI在基于ARMLinux上的移植。

幾種比較成熟的嵌入式GUI的研究

Microwindows

Microwindows是由美國CenturySoftware公司開發(fā)的開放源碼的嵌入式GUI項(xiàng)目。它不需要其他圖形系統(tǒng)的支持,可以充分利用Linux提供的FrAMEbuffer機(jī)制來進(jìn)行圖形顯示。同時(shí)在底層提供了對多種芯片的支持,并基本上用C語言實(shí)現(xiàn),因此移植性很強(qiáng)。國內(nèi)也有人參與了這個(gè)項(xiàng)目的開發(fā),并編寫了GB2312等字符集的支持。

Microwindows是基于分層式設(shè)計(jì)的,它允許不同的層可以被重新設(shè)計(jì)以滿足系統(tǒng)實(shí)現(xiàn)的需要,目前總共分為三層。最底層是屏幕、鼠標(biāo)或觸摸屏和鍵盤的驅(qū)動(dòng)程序,用于實(shí)現(xiàn)系統(tǒng)的顯示功能以及滿足用戶特有的輸入需求。中間層實(shí)現(xiàn)了一個(gè)可移植的圖形引擎,以提供對畫線、填充、剪切和著色的支持。在最上層,則提供了多種的API給應(yīng)用程序設(shè)計(jì)者。Microwindows支持兩種API:ECMAAPIW(類Win32API)和Nano-XAPIs。這些API對Win32和XWindow系統(tǒng)有很好的兼容性,使程序可以很容易地從其它系統(tǒng)上移植過來。其中比較完備的是Nano-XAPI。Nano-X設(shè)計(jì)成是一個(gè)客戶端/服務(wù)器的環(huán)境,在此模式下應(yīng)用程序與一個(gè)客戶端的庫相連,而這個(gè)庫則通過一個(gè)UNIXsocket與Nano-X服務(wù)器相連。每個(gè)應(yīng)用程序都通過UNIXsocket來傳遞各種參數(shù),并由服務(wù)端來完成客戶端的各種請求。當(dāng)為了滿足運(yùn)行速度以及調(diào)試的需求時(shí),還可以通過共享的內(nèi)存空間來完成傳播數(shù)據(jù)。

由于Microwindows為了與XWindow的兼容,它采用了傳統(tǒng)的基于UNIXsocket的客戶端/服務(wù)器結(jié)構(gòu)。此是,客戶端的畫圖、窗口建立等操作都是通過套接字與服務(wù)器通信。在這種情況下,系統(tǒng)就變得非常依賴于UNIXsocket,而UNIXsocket的傳遞都需要通過內(nèi)核,這樣在一些對實(shí)時(shí)性要求比較高的系統(tǒng)里就不太有利。而且Microwindows基本上用C語言實(shí)現(xiàn)的,雖然增強(qiáng)了可移植性,但也同樣導(dǎo)致了系統(tǒng)的運(yùn)行效率不高。同時(shí)Microwindows的開發(fā)工具FLNX也還不夠成熟,有待進(jìn)一步提高。

MiniGUI

MiniGUI是我國國內(nèi)自主開發(fā)、比較成熟的一個(gè)圖形用戶界面系統(tǒng),面向基于Linux的實(shí)時(shí)嵌入式系統(tǒng),使用現(xiàn)有成熟的圖形引擎(SV2GALib/LibGGI),采用類似WinCE的線程機(jī)制(目前MiniGUILite版本改用微客戶端/服務(wù)器模式來提供對多進(jìn)程的支持),集成了多字體和多字符集,支持硬件加速能力,充分使用顯示內(nèi)存。

從整體來看,MiniGUI也是屬于分層結(jié)構(gòu)設(shè)計(jì)(見圖1)。在最底層,GAL和IAL提供了Linux控制臺和底層圖形接口的支持以及輸入設(shè)備比如鼠標(biāo)、鍵盤等的驅(qū)動(dòng),PThread則是提供了內(nèi)核級線程支持的函數(shù)庫;中間層MiniGUIKernel則包括了窗口系統(tǒng)的各個(gè)模塊,MiniGUI本身是運(yùn)行在多線程模式下,它的各個(gè)模塊都是以單獨(dú)的線程運(yùn)行,同時(shí)它也利用線程來實(shí)現(xiàn)多窗口;最上層,則是提供給各種應(yīng)用程序使用的API函數(shù)。MiniGUI中利用線程之間的同步操作,實(shí)現(xiàn)了客戶線程和服務(wù)線程之間的微客戶端/服務(wù)器結(jié)構(gòu),因?yàn)樗目蛻艉头?wù)器是同一進(jìn)程的兩個(gè)不同線程。它的核心實(shí)現(xiàn)主要體現(xiàn)在消息隊(duì)列數(shù)據(jù)結(jié)構(gòu)的使用上。

多線程有其一定的好處,但弱點(diǎn)則在于不同的線程共享了同一個(gè)地址空間,因此,客戶線程可能會(huì)破壞系統(tǒng)服務(wù)器線程的數(shù)據(jù),導(dǎo)致系統(tǒng)健壯性不夠健全。雖然目前的MiniGUILite版本拋棄LinuxThread庫而改用微客戶端/服務(wù)器模式提供對多進(jìn)程的支持,但是仍然存在著對多進(jìn)程支持弱、圖形功能不完善、窗口剪切不完備等問題。

18.jpg

QT/Embedded和Qtopia

QT/Embedded是著名的QT庫開發(fā)商TrollTech開發(fā)的基于framebuffer、面向嵌入式系統(tǒng)的QT版本。它的特點(diǎn)主要有界面美觀、色彩配比好,使用與QT/Windows和QT/X11完全一致的API接口,許多基于QT的程序可以非常方便地移植到嵌入式系統(tǒng);同時(shí)它具有豐富的模塊,用戶可以根據(jù)需要選擇QT/Embedded的特性集合。Qtopia是TrollTech專門為嵌入式Linux設(shè)備所定制終端用戶平臺,它包括了Qtopia庫和Qtopia的服務(wù)器及客戶端應(yīng)用程序。

QT/Embedded和Qtopia的結(jié)構(gòu)如圖2所示。QT/Embed2ded實(shí)現(xiàn)了對下層輸入設(shè)備的驅(qū)動(dòng)和底層圖形接口以及各基類和API。Qtopia也是以客戶/服務(wù)器的方式,通過消息機(jī)制來管理各種應(yīng)用程序。QT的資源相當(dāng)豐富,基于QTAPI開發(fā)的應(yīng)用程序相當(dāng)多,像KDE這種應(yīng)用范圍極廣的GUI也是使用QTAPI開發(fā)出來的;而且OPIE組織也開發(fā)了并改進(jìn)了許多專門基于QT/Embedded上的Qtopia應(yīng)用程序及函數(shù)庫。

不過QT/Embedded對于系統(tǒng)的資源要求非常高,需要在較大的存儲(chǔ)空間和運(yùn)行空間上才可以運(yùn)行;而且它是基于C++來實(shí)現(xiàn)的,而這種C++接口對于嵌入式系統(tǒng)中的某些應(yīng)用來說就顯得比較臃腫;另外如若需要修改QT/Embedded并在商業(yè)產(chǎn)品中發(fā)布,則需要分別購買開發(fā)授權(quán)及運(yùn)行時(shí)授權(quán),所需費(fèi)用太昂貴。

基于ARMLinux平臺的移植

編譯環(huán)境的建立

GUI的編譯通常都是在PC機(jī)上執(zhí)行的,也就是說,編譯器本身能夠在PC機(jī)上執(zhí)行,同時(shí)編譯源代碼生成的二進(jìn)制文件必須能在目標(biāo)機(jī)上執(zhí)行,這類編譯器通常稱為交叉編譯器。對于ARM平臺,我們安裝了cross-arm-binutils-*.i386.rpm、cross-arm-gcc-*.i386.rpm、cross-arm-glibc-*.i386.rpm這三個(gè)包。這些包都可以從網(wǎng)上免費(fèi)獲取,“*”通常代表版本號。arm-binutils這個(gè)包一般包含了一些針對ARM平臺的二進(jìn)制工具,比如arm-STrip、arm-ar等命令;arm-glibc這個(gè)包包含的是標(biāo)準(zhǔn)C的函數(shù)庫的ARM的版本以及對應(yīng)的頭文件;arm-gcc中包含的則是生成ARM平臺代碼的x86上的交叉編譯器。執(zhí)行rpm命令將這些包安裝到PC機(jī)上,若不在系統(tǒng)默認(rèn)搜索目錄下,比如安裝在/opt/cross目錄下,則必須將/opt/cross/bin目錄加到系統(tǒng)的PATH環(huán)境變量中,這樣在每次編譯時(shí)系統(tǒng)才能找得到編譯器。另外需要注意的是,編譯時(shí)所用的函數(shù)庫版本要與目標(biāo)版上運(yùn)行時(shí)所用的函數(shù)庫版本一致。經(jīng)過上述步驟,就已經(jīng)建立了交叉編譯環(huán)境,接下來的就是選擇或修改GUI的編譯選項(xiàng),從而生成所需要的GUI系統(tǒng)。

Microwindows的移植

Microwindows的定制和編譯主要是通過修改它源程序根目錄下的cONfig這個(gè)文件中的選項(xiàng)來實(shí)現(xiàn),而在configs這個(gè)目錄下已經(jīng)有一些針對不同平臺的config文件,若目標(biāo)平臺與之定義的相符,可直接將其拷貝到根目錄下覆蓋掉原有的config文件,然后輸入命令make來開始編譯。另外還可以執(zhí)行根目錄下的xconfigure文件,它提供了一個(gè)可視化的窗口來方便用戶進(jìn)行編譯選項(xiàng)配置。下面介紹一下其中主要的一些選項(xiàng):

目標(biāo)平臺選項(xiàng)。ARCH表示目標(biāo)機(jī)的平臺,比如ARCH=LINUX-ARM,BIGENDIAN表示目標(biāo)平臺是否為大數(shù)端;

圖像支持選項(xiàng)。HAVE-BMP-SUPPORT=Y、HAVEJPEG-SUPPORT=Y兩項(xiàng)表示對BMP和JPEG格式圖像的支持(還有其它格式選項(xiàng))。設(shè)置JPEG圖像選項(xiàng)時(shí)必須給出外部jpeg解壓縮庫的位置,例如LIBJPEG=/usr/lib/libjpeg.a;

字體支持選項(xiàng)。HAVE-FREETYPE-SUPPORT=Y、HAVE-T1LIB-SUPPORT=Y表示支持TrueType和AdobeType1字體,這些庫也必須預(yù)先編譯并在配置文件中指定其位置,Microwindows的網(wǎng)站上提供了許多字庫函數(shù)的下載。另外,Microwindows還提供了中文BIG5、GB2312以及日文和韓文的支持;

輸出顯示選項(xiàng)。FRAMEBUFFER=Y表示使用Linux上的framebuffer來實(shí)現(xiàn)顯示,當(dāng)然Microwindows也支持X11顯示;

輸入設(shè)備選項(xiàng)。Microwindows提供了一系列的鼠標(biāo)(包括觸摸屏)和鍵盤的支持,可以根據(jù)不同的系統(tǒng)選擇適當(dāng)?shù)倪x項(xiàng)。

配置完成后,執(zhí)行make命令開始編譯。編譯完成后,將生成的庫以及可執(zhí)行文件打包下載到目標(biāo)板上。如果庫文件沒有放在目標(biāo)系統(tǒng)的默認(rèn)搜索庫的路徑中,那么還需將此目錄加到LD-LIBRARY-PATH環(huán)境變量中,然后即可以運(yùn)行nano-X服務(wù)器及各應(yīng)用程序。

MiniGUI的移植

下載MiniGUI的庫文件源代碼包libminigui-3.tar.gz和資源文件包minigui-res-3.tar.gz以及演示程序包mde-3.tar.gz后,將它們分別解壓到各自的目錄下。首先介紹庫文件的編譯,它的編譯配置主要通過執(zhí)行源程序根目錄下configure這個(gè)文件,并給它傳遞相關(guān)的參數(shù)來實(shí)現(xiàn)。比如:CC=arm-linux-gcc./configure———host=i386-linux———target=arm-linux。其中,CC參數(shù)表示所使用的編譯器名,host表示編譯環(huán)境所在的主機(jī)類型,target表示編譯生成后目標(biāo)系統(tǒng)的主機(jī)類型,當(dāng)前默認(rèn)編譯生成的是MiniGUIThread版本,如果要生成MiniGUILite版本需再加上參數(shù)———enable-lite,更多參數(shù)可以通過執(zhí)行。/configure-help來查詢。在執(zhí)行configure之前,根據(jù)硬件特性可以修改根目錄下的etc目錄下的Minigui-3d.cfg和Minigui-flat.cfg兩個(gè)文件中的選項(xiàng)。比如,如果目標(biāo)系統(tǒng)的framebuffer大小是320X240,每像素占12bits,則將上述兩個(gè)文件中[fbcon]組中的defaultmode的值就應(yīng)設(shè)置為320X240-12bpp。配置完成以后執(zhí)行make命令開始編譯,編譯結(jié)束后執(zhí)行makeinstall命令,在/usr/local/lib下面會(huì)生成交叉編譯出來的動(dòng)態(tài)庫和靜態(tài)庫文件。其次,資源文件的安裝比較簡單,解壓以后在其根目錄下有一個(gè)名叫config.linux的文件,修改其中的TOPDIR一項(xiàng),這樣執(zhí)行makeinstall安裝命令以后,所有資源文件會(huì)被安裝到TOPDIR所定義的目錄下的usr/local/lib/minigui下。最后演示程序包的編譯與庫文件編譯類似,也是執(zhí)行其根目錄下的configure文件并傳遞相關(guān)參數(shù),然后執(zhí)行make命令來編譯。若編譯庫文件時(shí)選擇———enable-lite參數(shù),由于MiniGUI-Lite采用的是微客戶端/服務(wù)器架構(gòu),要運(yùn)行應(yīng)用程序必須先啟動(dòng)服務(wù)器程序mginit,然后才能運(yùn)行其它的應(yīng)用程序;若編譯庫文件時(shí)沒有添———enable-lite參數(shù),則mginit目錄根本不會(huì)編譯進(jìn)去,演示程序可以直接執(zhí)行。

17.jpg

QT的移植

QT的編譯步驟比較復(fù)雜。Qtopia的根目錄下有README.html文件介紹了PC機(jī)上編譯的步驟及參數(shù)。因此,本文主要描述在編譯成以ARM為目標(biāo)平臺時(shí)有所區(qū)別的幾個(gè)步驟及參數(shù)。下載Qt/Embedded、Qt/X11和Qtopia三個(gè)包并分別解壓。這三者的編譯配置都是通過執(zhí)行相應(yīng)根目錄下的configure文件并傳遞相關(guān)參數(shù)來實(shí)現(xiàn),另外在Qtopia目錄下src/qt/qconfig-qpe.h文件中要定義一些相關(guān)的宏,這樣在編譯時(shí)編譯器會(huì)根據(jù)所定義的宏選擇需要的代碼來進(jìn)行編譯。比如,目標(biāo)系統(tǒng)所使用的觸摸屏實(shí)現(xiàn)方式與IPAQ類似,若要使QT將所支持的代碼編譯進(jìn)來,則需在qt2config-qpe.h中定義宏QT-QWS-IPAQ。首先,我們在執(zhí)行configure對QT/Embedded進(jìn)行配置時(shí),傳遞了三個(gè)參數(shù)-xplatformlinux-arm-g++、-qconfigqpe和-no-qvfb。其中第一個(gè)參數(shù)表示,編譯后二進(jìn)制文件執(zhí)行時(shí)所在的目標(biāo)平臺類型;第二個(gè)參數(shù)告訴編譯器配置頭文件是在src/tools/目錄下叫做qconfig-qpe.h,通常這個(gè)文件就是Qtopia目錄下src/qt/qconfig-qpe.h的一個(gè)拷貝;第三個(gè)參數(shù)表示在編譯時(shí)不需要編譯qvfb工具,當(dāng)目標(biāo)系統(tǒng)不支持Framebuffer時(shí),在執(zhí)行啟動(dòng)Qtopia之前先通過執(zhí)行qvfb來產(chǎn)生一個(gè)虛擬的Framebuffer,這時(shí)再啟動(dòng)Qtopia相應(yīng)的內(nèi)容就會(huì)顯示在qvfb上。在對Qtopia進(jìn)行配置時(shí),只傳遞了一個(gè)參數(shù):-platformarm-linux-g++,表示目標(biāo)平臺是ARM平臺。當(dāng)然在上述配置過程中還可以使用其它一些參數(shù),這些參數(shù)可以通過傳遞-help參數(shù)給configure來查詢。在配置并編譯完之后,將Qtopia目錄下的運(yùn)行時(shí)相關(guān)目錄全部打包并下載到目標(biāo)系統(tǒng)上,設(shè)置了相應(yīng)的環(huán)境變量(比如QPEDIR、QTDIR和LD-LIBRARY-PATH等)后,就可以執(zhí)行。當(dāng)然目標(biāo)系統(tǒng)上的特殊硬件的支持需要通過修改QT/Embedded下的對應(yīng)源程序來完成。

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。