引言
什么是嵌入式系統(tǒng)
嵌入式系統(tǒng)一般指以嵌入式微處理器為核心,,有別于PC系統(tǒng),有計算機的部分功能但又不稱之為計算機的設備或器材,。它主要是以應用為目的,,系統(tǒng)軟硬件于一體,通常要求具有代碼小,、響應速度快,、可靠性高,、低功耗,、集成度高等特點。嵌入式系統(tǒng)遍布于各個行業(yè)以及人們的日常生活當中,,比如掌上PDA,、移動計算設備、電視機頂盒,、手機,、汽車、數(shù)字相機,、家庭自動化系統(tǒng),、安全系統(tǒng)、自動售貨機、工業(yè)自動化儀表與醫(yī)療儀器等,。
什么是嵌入式系統(tǒng)中的GUI
隨著后PC時代的到來,,嵌入式系統(tǒng)的性能有了大幅度的提高,應用范圍也越來越廣,,當初的一些簡單的人機交互接口已經(jīng)無法滿足人們的要求,。而與此同時,在臺式PC機上圖形交互界面早已普及并成熟,,于是在嵌入式系統(tǒng)中也逐漸出現(xiàn)了圖形用戶界面(GraphicUserInterface,GUI),,特別是在一些消費類產(chǎn)品中。嵌入式系統(tǒng)中的GUI就是在嵌入式系統(tǒng)中為特定的硬件設備或環(huán)境而設計的圖形用戶界面系統(tǒng),。由于受到當前嵌入式系統(tǒng)本身特點的影響,,并受其發(fā)展限制,所以嵌入式系統(tǒng)中的GUI應該有如下特點:
占用的存儲空間以及運行時占用資源少,;運行速度以及響應速度快,;可靠性高;便于移植和定制,。
Linux有開放的源碼,、高效穩(wěn)定的內(nèi)核、良好的開發(fā)環(huán)境以及支持多種硬件平臺等特點,,而且由于Linux的可配置性和可模塊化,,一個Linux內(nèi)核經(jīng)過配置和裁減可以只占用幾百K左右的存儲空間,使其在嵌入式系統(tǒng)中也得到廣泛應用,。然而,,在嵌入式系統(tǒng)中有嚴格的資源限制,臺式機Linux平臺下成熟的GUI無法直接移植到嵌入式設備上,。因此,,嵌入式系統(tǒng)中基于Linux的GUI愈發(fā)成為開發(fā)基于Linux的嵌入式系統(tǒng)所必須面對的問題。目前,,隨著嵌入式行業(yè)分工的細化,,出現(xiàn)了專門的公司致力開發(fā)Linux下的GUI并給其它公司提供授權,從而縮短了嵌入式系統(tǒng)的開發(fā)周期,。本文就旨在于對這樣的幾種嵌入式GUI進行研究,,列出表1進行比較,并介紹這幾種GUI在基于ARMLinux上的移植,。
幾種比較成熟的嵌入式GUI的研究
Microwindows
Microwindows是由美國CenturySoftware公司開發(fā)的開放源碼的嵌入式GUI項目,。它不需要其他圖形系統(tǒng)的支持,可以充分利用Linux提供的FrAMEbuffer機制來進行圖形顯示,。同時在底層提供了對多種芯片的支持,,并基本上用C語言實現(xiàn),,因此移植性很強。國內(nèi)也有人參與了這個項目的開發(fā),,并編寫了GB2312等字符集的支持,。
Microwindows是基于分層式設計的,它允許不同的層可以被重新設計以滿足系統(tǒng)實現(xiàn)的需要,,目前總共分為三層,。最底層是屏幕、鼠標或觸摸屏和鍵盤的驅(qū)動程序,,用于實現(xiàn)系統(tǒng)的顯示功能以及滿足用戶特有的輸入需求,。中間層實現(xiàn)了一個可移植的圖形引擎,以提供對畫線,、填充,、剪切和著色的支持。在最上層,,則提供了多種的API給應用程序設計者,。Microwindows支持兩種API:ECMAAPIW(類Win32API)和Nano-XAPIs。這些API對Win32和XWindow系統(tǒng)有很好的兼容性,,使程序可以很容易地從其它系統(tǒng)上移植過來,。其中比較完備的是Nano-XAPI。Nano-X設計成是一個客戶端/服務器的環(huán)境,,在此模式下應用程序與一個客戶端的庫相連,,而這個庫則通過一個UNIXsocket與Nano-X服務器相連。每個應用程序都通過UNIXsocket來傳遞各種參數(shù),,并由服務端來完成客戶端的各種請求,。當為了滿足運行速度以及調(diào)試的需求時,還可以通過共享的內(nèi)存空間來完成傳播數(shù)據(jù),。
由于Microwindows為了與XWindow的兼容,,它采用了傳統(tǒng)的基于UNIXsocket的客戶端/服務器結構。此是,,客戶端的畫圖,、窗口建立等操作都是通過套接字與服務器通信。在這種情況下,,系統(tǒng)就變得非常依賴于UNIXsocket,而UNIXsocket的傳遞都需要通過內(nèi)核,,這樣在一些對實時性要求比較高的系統(tǒng)里就不太有利,。而且Microwindows基本上用C語言實現(xiàn)的,,雖然增強了可移植性,但也同樣導致了系統(tǒng)的運行效率不高,。同時Microwindows的開發(fā)工具FLNX也還不夠成熟,,有待進一步提高。
MiniGUI
MiniGUI是我國國內(nèi)自主開發(fā)、比較成熟的一個圖形用戶界面系統(tǒng),,面向基于Linux的實時嵌入式系統(tǒng),,使用現(xiàn)有成熟的圖形引擎(SV2GALib/LibGGI),采用類似WinCE的線程機制(目前MiniGUILite版本改用微客戶端/服務器模式來提供對多進程的支持),,集成了多字體和多字符集,,支持硬件加速能力,充分使用顯示內(nèi)存,。
從整體來看,,MiniGUI也是屬于分層結構設計(見圖1)。在最底層,,GAL和IAL提供了Linux控制臺和底層圖形接口的支持以及輸入設備比如鼠標,、鍵盤等的驅(qū)動,PThread則是提供了內(nèi)核級線程支持的函數(shù)庫,;中間層MiniGUIKernel則包括了窗口系統(tǒng)的各個模塊,,MiniGUI本身是運行在多線程模式下,它的各個模塊都是以單獨的線程運行,,同時它也利用線程來實現(xiàn)多窗口,;最上層,則是提供給各種應用程序使用的API函數(shù),。MiniGUI中利用線程之間的同步操作,,實現(xiàn)了客戶線程和服務線程之間的微客戶端/服務器結構,因為它的客戶和服務器是同一進程的兩個不同線程,。它的核心實現(xiàn)主要體現(xiàn)在消息隊列數(shù)據(jù)結構的使用上,。
多線程有其一定的好處,但弱點則在于不同的線程共享了同一個地址空間,,因此,,客戶線程可能會破壞系統(tǒng)服務器線程的數(shù)據(jù),導致系統(tǒng)健壯性不夠健全,。雖然目前的MiniGUILite版本拋棄LinuxThread庫而改用微客戶端/服務器模式提供對多進程的支持,,但是仍然存在著對多進程支持弱、圖形功能不完善,、窗口剪切不完備等問題,。
QT/Embedded和Qtopia
QT/Embedded是著名的QT庫開發(fā)商TrollTech開發(fā)的基于framebuffer、面向嵌入式系統(tǒng)的QT版本,。它的特點主要有界面美觀,、色彩配比好,使用與QT/Windows和QT/X11完全一致的API接口,,許多基于QT的程序可以非常方便地移植到嵌入式系統(tǒng),;同時它具有豐富的模塊,,用戶可以根據(jù)需要選擇QT/Embedded的特性集合。Qtopia是TrollTech專門為嵌入式Linux設備所定制終端用戶平臺,,它包括了Qtopia庫和Qtopia的服務器及客戶端應用程序,。
QT/Embedded和Qtopia的結構如圖2所示。QT/Embed2ded實現(xiàn)了對下層輸入設備的驅(qū)動和底層圖形接口以及各基類和API,。Qtopia也是以客戶/服務器的方式,,通過消息機制來管理各種應用程序。QT的資源相當豐富,,基于QTAPI開發(fā)的應用程序相當多,,像KDE這種應用范圍極廣的GUI也是使用QTAPI開發(fā)出來的;而且OPIE組織也開發(fā)了并改進了許多專門基于QT/Embedded上的Qtopia應用程序及函數(shù)庫,。
不過QT/Embedded對于系統(tǒng)的資源要求非常高,,需要在較大的存儲空間和運行空間上才可以運行;而且它是基于C++來實現(xiàn)的,,而這種C++接口對于嵌入式系統(tǒng)中的某些應用來說就顯得比較臃腫,;另外如若需要修改QT/Embedded并在商業(yè)產(chǎn)品中發(fā)布,則需要分別購買開發(fā)授權及運行時授權,,所需費用太昂貴,。
基于ARMLinux平臺的移植
編譯環(huán)境的建立
GUI的編譯通常都是在PC機上執(zhí)行的,也就是說,,編譯器本身能夠在PC機上執(zhí)行,,同時編譯源代碼生成的二進制文件必須能在目標機上執(zhí)行,這類編譯器通常稱為交叉編譯器,。對于ARM平臺,,我們安裝了cross-arm-binutils-*.i386.rpm、cross-arm-gcc-*.i386.rpm,、cross-arm-glibc-*.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)默認搜索目錄下,,比如安裝在/opt/cross目錄下,則必須將/opt/cross/bin目錄加到系統(tǒng)的PATH環(huán)境變量中,,這樣在每次編譯時系統(tǒng)才能找得到編譯器,。另外需要注意的是,,編譯時所用的函數(shù)庫版本要與目標版上運行時所用的函數(shù)庫版本一致,。經(jīng)過上述步驟,,就已經(jīng)建立了交叉編譯環(huán)境,接下來的就是選擇或修改GUI的編譯選項,,從而生成所需要的GUI系統(tǒng),。
Microwindows的移植
Microwindows的定制和編譯主要是通過修改它源程序根目錄下的cONfig這個文件中的選項來實現(xiàn),而在configs這個目錄下已經(jīng)有一些針對不同平臺的config文件,,若目標平臺與之定義的相符,,可直接將其拷貝到根目錄下覆蓋掉原有的config文件,然后輸入命令make來開始編譯,。另外還可以執(zhí)行根目錄下的xconfigure文件,,它提供了一個可視化的窗口來方便用戶進行編譯選項配置。下面介紹一下其中主要的一些選項:
目標平臺選項,。ARCH表示目標機的平臺,,比如ARCH=LINUX-ARM,BIGENDIAN表示目標平臺是否為大數(shù)端;
圖像支持選項,。HAVE-BMP-SUPPORT=Y,、HAVEJPEG-SUPPORT=Y兩項表示對BMP和JPEG格式圖像的支持(還有其它格式選項)。設置JPEG圖像選項時必須給出外部jpeg解壓縮庫的位置,,例如LIBJPEG=/usr/lib/libjpeg.a;
字體支持選項,。HAVE-FREETYPE-SUPPORT=Y、HAVE-T1LIB-SUPPORT=Y表示支持TrueType和AdobeType1字體,,這些庫也必須預先編譯并在配置文件中指定其位置,,Microwindows的網(wǎng)站上提供了許多字庫函數(shù)的下載。另外,,Microwindows還提供了中文BIG5,、GB2312以及日文和韓文的支持;
輸出顯示選項,。FRAMEBUFFER=Y表示使用Linux上的framebuffer來實現(xiàn)顯示,,當然Microwindows也支持X11顯示;
輸入設備選項,。Microwindows提供了一系列的鼠標(包括觸摸屏)和鍵盤的支持,,可以根據(jù)不同的系統(tǒng)選擇適當?shù)倪x項。
配置完成后,,執(zhí)行make命令開始編譯,。編譯完成后,將生成的庫以及可執(zhí)行文件打包下載到目標板上,。如果庫文件沒有放在目標系統(tǒng)的默認搜索庫的路徑中,,那么還需將此目錄加到LD-LIBRARY-PATH環(huán)境變量中,,然后即可以運行nano-X服務器及各應用程序。
MiniGUI的移植
下載MiniGUI的庫文件源代碼包libminigui-3.tar.gz和資源文件包minigui-res-3.tar.gz以及演示程序包mde-3.tar.gz后,,將它們分別解壓到各自的目錄下,。首先介紹庫文件的編譯,它的編譯配置主要通過執(zhí)行源程序根目錄下configure這個文件,,并給它傳遞相關的參數(shù)來實現(xiàn),。比如:CC=arm-linux-gcc./configure———host=i386-linux———target=arm-linux。其中,,CC參數(shù)表示所使用的編譯器名,,host表示編譯環(huán)境所在的主機類型,target表示編譯生成后目標系統(tǒng)的主機類型,,當前默認編譯生成的是MiniGUIThread版本,,如果要生成MiniGUILite版本需再加上參數(shù)———enable-lite,更多參數(shù)可以通過執(zhí)行。/configure-help來查詢,。在執(zhí)行configure之前,,根據(jù)硬件特性可以修改根目錄下的etc目錄下的Minigui-3d.cfg和Minigui-flat.cfg兩個文件中的選項。比如,,如果目標系統(tǒng)的framebuffer大小是320X240,每像素占12bits,則將上述兩個文件中[fbcon]組中的defaultmode的值就應設置為320X240-12bpp,。配置完成以后執(zhí)行make命令開始編譯,編譯結束后執(zhí)行makeinstall命令,,在/usr/local/lib下面會生成交叉編譯出來的動態(tài)庫和靜態(tài)庫文件,。其次,資源文件的安裝比較簡單,,解壓以后在其根目錄下有一個名叫config.linux的文件,,修改其中的TOPDIR一項,這樣執(zhí)行makeinstall安裝命令以后,,所有資源文件會被安裝到TOPDIR所定義的目錄下的usr/local/lib/minigui下,。最后演示程序包的編譯與庫文件編譯類似,也是執(zhí)行其根目錄下的configure文件并傳遞相關參數(shù),,然后執(zhí)行make命令來編譯,。若編譯庫文件時選擇———enable-lite參數(shù),由于MiniGUI-Lite采用的是微客戶端/服務器架構,,要運行應用程序必須先啟動服務器程序mginit,然后才能運行其它的應用程序,;若編譯庫文件時沒有添———enable-lite參數(shù),則mginit目錄根本不會編譯進去,,演示程序可以直接執(zhí)行,。
QT的移植
QT的編譯步驟比較復雜。Qtopia的根目錄下有README.html文件介紹了PC機上編譯的步驟及參數(shù)。因此,,本文主要描述在編譯成以ARM為目標平臺時有所區(qū)別的幾個步驟及參數(shù),。下載Qt/Embedded、Qt/X11和Qtopia三個包并分別解壓,。這三者的編譯配置都是通過執(zhí)行相應根目錄下的configure文件并傳遞相關參數(shù)來實現(xiàn),,另外在Qtopia目錄下src/qt/qconfig-qpe.h文件中要定義一些相關的宏,這樣在編譯時編譯器會根據(jù)所定義的宏選擇需要的代碼來進行編譯,。比如,,目標系統(tǒng)所使用的觸摸屏實現(xiàn)方式與IPAQ類似,,若要使QT將所支持的代碼編譯進來,,則需在qt2config-qpe.h中定義宏QT-QWS-IPAQ。首先,,我們在執(zhí)行configure對QT/Embedded進行配置時,,傳遞了三個參數(shù)-xplatformlinux-arm-g++、-qconfigqpe和-no-qvfb,。其中第一個參數(shù)表示,,編譯后二進制文件執(zhí)行時所在的目標平臺類型;第二個參數(shù)告訴編譯器配置頭文件是在src/tools/目錄下叫做qconfig-qpe.h,通常這個文件就是Qtopia目錄下src/qt/qconfig-qpe.h的一個拷貝,;第三個參數(shù)表示在編譯時不需要編譯qvfb工具,,當目標系統(tǒng)不支持Framebuffer時,在執(zhí)行啟動Qtopia之前先通過執(zhí)行qvfb來產(chǎn)生一個虛擬的Framebuffer,這時再啟動Qtopia相應的內(nèi)容就會顯示在qvfb上,。在對Qtopia進行配置時,,只傳遞了一個參數(shù):-platformarm-linux-g++,表示目標平臺是ARM平臺。當然在上述配置過程中還可以使用其它一些參數(shù),,這些參數(shù)可以通過傳遞-help參數(shù)給configure來查詢,。在配置并編譯完之后,將Qtopia目錄下的運行時相關目錄全部打包并下載到目標系統(tǒng)上,,設置了相應的環(huán)境變量(比如QPEDIR,、QTDIR和LD-LIBRARY-PATH等)后,就可以執(zhí)行,。當然目標系統(tǒng)上的特殊硬件的支持需要通過修改QT/Embedded下的對應源程序來完成,。