在嵌入式系統領域,有不少GUI系統,如QNX Photon MicroGUI等,可是具體到嵌入式Linux領域又有哪些可供選擇的GUI系統呢?
在嵌入式環境底下,GUI系統的整體構架跟PC Desktop相去不遠,例如繪圖函數庫、字型、事件處理等也都是嵌入式GUI系統所要面臨的。但是嵌入式系統本身由於體積小、資源少的特點,所以在整體設計上必須較為嚴謹,必須考慮的條件更多,有時很像又回到了Dos下編制程序的年代,對於軟件所占的存儲量有時可以說是锱铢必較。
Unix環境下的圖形視窗標准為X Window System(以下簡稱X標准),Linux是類Unix系統,所以頂層運行的GUI系統是兼容X標准的XFree86系統。X標准大致可以劃分X Server、Graphic Library(底層繪圖函數庫)、Toolkits、Window Manager、Internationalization(I18N)等幾大部分(詳細內容見鏈接)。
筆者認為,雖然X架構不錯,但卻不怎麼適用於嵌入式環境,因為實際工作起來實在太過於龐大,因此許多嵌入式Linux GUI系統會把上述幾點合並,甚至全部綁到一起,當然這樣同時也會失去很多彈性與擴展功能,但為了適應於嵌入式系統,這也是一個解決問題的方法。本文下面就介紹一下現存的主流嵌入式Linux下GUI解決方案。
主流解決方案介紹
Qt/Embedded
Qt是Trolltech這家商業公司所開發的一個跨平台FrameWork環境,在X環境下可以看作是一套功能完整的用戶界面工具包,它采用類似C++的語法,並且具備物件導向功能。跨平台的特性可以讓使用Qt編寫的軟件,在Microsoft Windows 95/98/2000、 Microsoft Windows NT、MacOS X、Linux、Solaris、HP-UX、Tru64 (Digital UNIX)、Irix、FreeBSD、BSD/OS、SCO、AIX等許多平台上執行。雖然是商業公司的產品,但是Qt走的卻是開源路線,並遵循同樣的游戲規則,提供免費下載,全部都是開放源代碼,非商業用途亦采用GPL的版權宣告,著名的Open Source “KDE” 項目便是采用Qt所開發的。
Trolltech也針對嵌入式環境推出了“Qt/Embedded”產品。與桌面版本不同,Qt/Embedded已經直接取代掉X Server及X Library等角色,所有的功能全部整合在一起。
Qt/Embedded 同樣具有跨平台的特點,省掉了不少移植軟件的功夫,這樣的概念和Java十分接近。同時它還采用模塊化設計,其最大的好處是有彈性, Qt/Embedded號稱最小可以縮到800Kb左右,最多可以長到3Mb(for Intel x86),這樣的彈性也讓Qt/Embedded更適合在嵌入式環境下生存。
圖1 QPE的主界面
另外,Trolltech公司還推出了針對PDA軟件的整體解決方案QPE(Qt Plamtop Environment)。它從底層的GUI系統、Window Manger、Soft Keyboard到上層的PIM、浏覽器、多媒體等,全部都考慮進去了。其主界面如圖1所示 ,內部包括地址簿、計算器、世界時間、時間設置、記事本、終端、文件浏覽器、幫助、媒體播放器、圖像浏覽器、文本編輯器等。
相對其他GUI來說, Qt/Embedded 應該說是肥美型的產品,功能豐富,但能消化它的東西只能是高端產品,32MB內存是運行它的最小要求。因此,如果開發的產品不是高端的信息終端類產品,不應優先考慮 Qt/Embedded。
GtkFB
自從Qt推出了嵌入式版本之後,雖然GTK+並非商業公司所發展,但也加緊腳步推出了GtkFB方案,其宗旨就是要為嵌入式系統推出一套基於GTK+的GUI解決方案。與Qt/Embedded類似,GtkFB也跳過X層直接與FrameBuffer溝通,因此也具有Qt/Embedded的幾項優點,不過由於不是商業軟件,在發展的速度上較為緩慢。
Microwindows
Microwindows Open Source Project成立的宗旨在於針對體積小的裝置,建立一套先進的視窗環境,在Linux桌面上通過交叉編譯可以很容易地制作出micro-windows的程序。MicroWindows能夠在沒有任何操作系統或其他圖形系統的支持下運行,它能對裸顯示設備進行直接操作。這樣,MicroWindows就顯得十分小巧,便於移植到各種硬件和軟件系統上。
然而MicroWindows 的免費版本進展一直很慢,幾乎處於停頓狀態,而且至今為止,國內沒有任何一家專業對 MicroWindows 提供全面技術支持、服務和擔保的公司。
MiniGUI
圖2 MiniGUI應用程序截圖
MiniGUI是中國人做得比較好的自由軟件之一,它是在Linux控制台上運行的多窗口圖形操作系統,可以在以Linux為基礎的應用平台上提供一個簡單可行的MiniGUI支持系統。“小”是MiniGUI的特色,MiniGUI可以應用在電視機頂盒、實時控制系統、掌上電腦等諸多場合。由於這是由中國人自己開發的GUI系統,所以MiniGUI對於中文的支持最好。它支持GB2312與BIG5字元集,其他字元集也可以輕松加入。界面如圖2所示。
Pure X架構
Tiny X Server是XFree86 Project的一部分,由Keith Pachard先生所發展,而他本身就是XFree86專案的核心成員之一。一般的X Server都太過於龐大,因此Keith Packard就以XFree86為基礎,精簡了不少東西而成Tiny X Server,它的體積可以小到幾百Kb而已,非常適合應用於嵌入式環境。
以純X Window System搭配Tiny X Server架構來說,最大的優點就是彈性與開發速度,因為與桌面的X架構相同,因此相對於很多以Qt、GTK+、FLTK等開發的軟件可以很容易地移植上來。
雖然移植方便,但是卻有體積大的缺點,由於很多軟件本來是針對桌面環境開發的,因此無形之中具備了桌面環境中很多復雜的功能。因此“調校”變成采用此架構最大的課題,有時候重新改寫都可能比調校所需的時間還短。
OpenGUI
OpenGUI在Linux系統上已經存在很長時間了。最初的名字叫FastGL,只支持256色的線性顯存模式,但目前也支持其他顯示模式,並且支持多種操作系統平台,比如MS-DOS、QNX和Linux等,不過目前只支持x86硬件平台。OpenGUI分為三層: 最低層是由匯編語言編寫的快速圖形引擎;中間層提供了圖形繪制API,包括線條、矩形、圓弧等,並且兼容Borland的BGIAPI;第三層用C++編寫,提供了完整的GUI對象庫。
OpenGUI采用LGPL條款發布。OpenGUI比較適合於基於x86平台的實時系統,跨平台的可移植性較差,目前發展較慢。
一點建議
綜合上述GUI解決方案各方面的性能,歸結起來有在國內有四種GUI較為適用,筆者對其做出推薦。
1.OpenGUI
由於基於匯編實現內核,並利用MMX指令進行了優化,OpenGUI運行速度非常快。它支持32位的機器,能夠在多種操作系統下運行,主要用來在這些系統中開發圖形應用程序和游戲。由於歷史悠久,OpenGUI非常穩定,但是由於其內核用匯編語言實現,其內部使用的是私有的API,所以其可移植性較差,可配置性也較差。
2.Qt/Embedded
這個版本的主要特點是可移植性較好。因為Qt是KDE等項目使用的GUI支持庫,所以許多基於Qt的X Window程序可以非常方便地移植到Qt/Embedded版本上。因此,自從Qt/Embedded以GPL條款發布以來,就有大量的嵌入式Linux開發商轉到了Qt/Embedded系統上,如韓國的Mizi公司。但是,由於它是基於C++類庫的,所以和其他GUI相比系統消耗資源較大。因此說Qt/Embedded是肥美型的產品,功能豐富,一般用於手持式高端信息產品。
3.MiniGUI和Micro-Windows的比較
MiniGUI和MicroWindows均為自由軟件,但這兩個系統的技術路線卻有所不同。MiniGUI的策略是建立在比較成熟的圖形引擎之上,比如Svgalib和LibGGI,開發的重點在於窗口系統、圖形接口之上。而MicroWindows的開發重點則在底層的圖形引擎之上,所以可以對裸顯示器直接操作,而窗口系統和圖形接口方面的功能還稍有欠缺。比如說,MiniGUI有一套用來支持多字符集和多編碼的函數接口,可以支持各種的字符集,包括GB、BIG5、UNI-CODE等,而MicroWindows在多字符支持上尚沒有統一接口。
X Window System的分層架構
● X Server
X Window System架構上有一項特點是別的GUI系統所沒有的,這個特點就是Client/Server架構,注意這裡和一般我們所熟知的某某服務器(Server端)跟PC端(Client端)相連接的情形是不同的。惟一類似的是X Window System本身也是采用網路架構設計。具體而簡單一點的說明就是,X Client可以看作我們在X上執行的軟件,X Server則是負責顯示及傳遞使用者輸入事件(包括鍵盤、鼠標等硬件裝置的輸入)。
● Graphic Library
我們可以把一幅圖案想象成有成千上萬個細微小點所組成,這種小點的單位通常為pixel,在同一平方單位裡這些小點數越高圖案就越清晰、畫質就越好,也就是說分辨率或解析率高。事實上我們要設計的視窗當然不可能是這樣一點一點地畫上去的,這樣太過浪費時間,基於這種觀念我們就設計出高階一點的函數來幫助我們解決這個繁瑣的步驟,例如各類視窗編程裡用到的畫點、畫線、畫矩形、畫圓形、畫不規則形、上色等函數。透過這些函數是的程序設計者不用去管畫一條線要幾個點以及如何讓顯示器顯示等林林總總低階的工作,我們稱繪圖相關的一組函數庫為GUI的基本Graphic Library。
● Toolkits
有了點、線、面的函數之後,雖然已經去除了大半的重復無聊工作,但是就開發視窗程序來說,還是顯得非常沒有效率,怎麼辦呢?只有繼續將構成視窗的抽象元件,如按鈕、卷軸、組合框等各類控件抽離出來,重新定義一組更高階的函數庫,在配合上聯系的語法函數就成立Toolkits這類的東西,目前流行的有QT、GTK+等。
● Window Manager
有了Toolkits,我們可以很輕松地建立視窗模塊(X Client),但是每個視窗模塊只負責自己模塊內的事務,那麼不同視窗間的溝通、協調,例如視窗的切換、放大、縮小等,就沒有模塊管理了,於是視窗管理員(Window Manager)就應運而生了。
● Internationalization
國際化通常是我們東方語系國家的人比較關心的議題,但是很多軟件一開始都由西方國家所主導開發,因此這點常常受到忽略,這個問題牽扯的層面很多,上從語言的顯示、輸入、中止語言習慣,下到文字位元的處理,完整的解決是必須從頭到腳徹底配合才能達成,只處理一半都只能說是一個蹩腳的系統。
隨著東方國家使用GUN/Linux的人口越來越多,I18N(i-eighteen-letters-n的縮寫)也日益受到重視,目前底層libc部分已經有完整的支持,剩下來便是GUI系統的問題,由於處理雙位元所耗的資源較大,西方國家主導的系統很多情況下,經過一些取捨,I18N就被犧牲掉了,整體而言Embedded Linux GUI系統在I18N的程度通常都沒有PC端的好,只有在需求時才會使用。