0引言
嵌入式圖形用戶界面(Graphic User Interface)是嵌入式產(chǎn)品設計和開發(fā)的重點,隨著嵌入式產(chǎn)品的廣泛應用,所實現(xiàn)的功能也日益強大和復雜,因此對嵌入式產(chǎn)品的GUI在功能、易用性、穩(wěn)定性等方面提出了更高的要求。目前的嵌入式GUI多是基于線程實現(xiàn),在穩(wěn)定性和功能上具有一定的局限性,所以開發(fā)多進程的GUI具有重要意義。
1多進程圖形用戶界面分析
1.1 多進程圖形用戶界面的優(yōu)勢
MiniGUI是由飛漫開發(fā)的基于事件驅(qū)動的圖形用戶界面支持系統(tǒng),采用微C/S機制和分層設計模型,利用Unix域套接字實現(xiàn)客戶應用程序和服務器程序之間的交互。早期的MiniGUI采用基于POSIX線程進行消息傳遞和窗口管理的機制,這種實現(xiàn)能夠提供最大程度的數(shù)據(jù)共享,實現(xiàn)多窗口系統(tǒng),但是也造成體系結(jié)構(gòu)上的脆弱,所有的窗口在一個進程或者地址空間中運行,一旦某個線程因為非法的數(shù)據(jù)訪問而導致崩潰或終止運行,整個圖形用戶界面系統(tǒng)都將受到影響。
在Linux系統(tǒng)中,任務是以進程為單位實現(xiàn)的。進程主要提供兩類虛擬化資源:虛擬地址空間和虛擬CPU。前者保證了進程在分配和管理內(nèi)存時就像機器上只有這一個進程。類似的,虛擬CPU也使進程看上去獨占了CPU。 Linux系統(tǒng)為進程提供了安全的運行環(huán)境,保證每個進程的獨立性,一個進程的崩潰不會危及其他進程。因此在多進程模式下,能夠同時運行多個客戶進程,如果某個進程不正常終止,其他的進程不會受到影響,因此實現(xiàn)多進程GUI將極大的提高系統(tǒng)的穩(wěn)定性。
1.2 進程間通信方式的選擇
基于多進程的GUI能夠?qū)崿F(xiàn)多個界面窗口的并發(fā)運行,通過進程間通信(IPC)實現(xiàn)窗口切換。進程間通信有多種形式,如管道、信號、共享內(nèi)存等。
共享內(nèi)存是由內(nèi)核出于在多個進程間交互信息的目的而保留的一塊內(nèi)存空間,多個進程共享該內(nèi)存空間,如果一個進程更新了其中的數(shù)據(jù),其他的進程會立即看到更新,而且共享內(nèi)存也是速度最快的進程間通訊機制。因此共享內(nèi)存作為進程間的通信方式對于多窗口GUI系統(tǒng)的編程實現(xiàn)非常合適。
1.3 基于微C/S機制的多進程模型
對于在微C/S機制上運行的GUI系統(tǒng),在運行過程中只能有一個服務器程序,其余的應用程序均為客戶程序。各客戶應用程序分別運行于各自不同的進程空間中,并且根據(jù)需要在應用程序之間通過進程間通信進行數(shù)據(jù)交換,完成窗口切換等過程。
MiniGUI為了實現(xiàn)客戶端和服務器端之間的通信,定義了一種簡單方便的請求/響應結(jié)構(gòu):客戶程序通過制定的結(jié)構(gòu)將請求發(fā)送到服務器,服務器處理請求并應答。在圖形界面運行后,服務器程序完成Server端連接初始化(ServerStart()),建立服務器端連接套接字Socket,其文件描述符為listenfd,進入到偵聽客戶連接請求狀態(tài),用一個Idlehandler4Server句柄等待接收客戶端的連接請求消息,在接受到來自于客戶端的連接請求消息后進行處理,將客戶應用程序加入到當前活動列表,并將客戶端套接字文件描述符clifd加入到偵聽文件集合中??蛻舳顺绦蛟谕瓿蛇B接初始化后(cli_conn())建立客戶端套接字Socket,并發(fā)送連接請求消息給Server程序,之后采用句柄 IdelHandler4Client偵聽服務器的返回消息。此后服務器程序進入一個消息循環(huán)過程,在此循環(huán)過程中繼續(xù)準備接收已連接的客戶程序的其他消息、新的客戶程序連接請求消息以及由系統(tǒng)產(chǎn)生的鼠標、鍵盤事件消息等,并在事件消息處理完成后用函數(shù)Send2Client將需要的消息發(fā)送到相應的客戶端應用程序。此后客戶端應用程序從套接字讀取由服務器程序處理后返回的消息,并把消息寫到當前進程的桌面隊列中,交由本進程消息循環(huán)進行分發(fā)和處理。在獲得消息處理結(jié)果后用cli_quest()向服務器端發(fā)送數(shù)據(jù)請求,服務器端接收數(shù)據(jù)請求后交由handle_request按照請求功能號的不同調(diào)用不同的服務例程進行處理,完成后發(fā)送一個{HWND_INVALID,0}消息和應答數(shù)據(jù),客戶端接收服務器應答消息,至此完成一個基本的消息循環(huán)通信過程。
基于以上的分析, MiniGUI下的基于微C/S機制的多進程GUI通信模型如圖1所示:
相比傳統(tǒng)的嵌入式圖形界面開發(fā),多進程圖形用戶界面系統(tǒng)在編程實現(xiàn)上有較大的復雜性。圖形用戶界面必須實現(xiàn)對窗口、層、異步事件、光標或者加上觸摸屏的管理,MiniGUI本身的消息機制的管理與內(nèi)核系統(tǒng)的其他機制之間的配合等。
[!--empirenews.page--]
2圖形用戶界面的開發(fā)重點
2.1 圖形用戶界面的窗口管理
MiniGUI提供了豐富的圖形構(gòu)件,如窗口、對話框、控件等,能夠?qū)崿F(xiàn)各種應用功能。MiniGUI本身是基于事件驅(qū)動的圖形用戶界系統(tǒng),所謂事件是指當用戶進行窗口操作時,如移動鼠標、單擊鼠標、進行鍵盤輸入的功能,這些動作會觸發(fā)一個相應的“事件”,并由支持系統(tǒng)收集,以特定方式翻譯為消息。應用程序一般包含自己的消息隊列,以接受系統(tǒng)消息并建立循環(huán),這樣的循環(huán)稱為消息循環(huán)。消息一般由代表消息類型的數(shù)和附加參數(shù)構(gòu)成。
多窗口系統(tǒng)在屏幕上要同時顯示多個應用程序窗口,程序窗口之間會有相互重疊關系。所以GUI系統(tǒng)運行后首先要創(chuàng)建一個根窗口,此窗口在系統(tǒng)啟動時由啟動腳本運行,是所有其他窗口的依附窗口。其他子窗口由用戶在根窗口內(nèi)點擊相應圖標產(chǎn)生,并且在子窗口內(nèi)可以繼續(xù)派生出自己的下一級子窗口,每個子窗口擁有一個窗口ID號,以標示與上級窗口的派生關系,據(jù)此便可以追溯到根窗口,而不至于產(chǎn)生窗口管理的混亂。窗口之間的可以為同級或者上下級派生關系。相互間的邏輯結(jié)構(gòu)如圖2所示:
2.2 多任務優(yōu)先級分配
由于嵌入式設備在硬件資源上的局限性,GUI系統(tǒng)對新的任務請求進行運行優(yōu)先級的分配和管理,以避免低運行級任務造成系統(tǒng)資源的浪費。GUI系統(tǒng)優(yōu)先運行級別較高的任務,對新產(chǎn)生的任務按照預定方式分配相應的運行級別,并與當前運行的任務級別進行比較,如果新任務是最高運行級別的任務,則掛起其他任務直到新任務處理結(jié)束;如果是相同運行級別的任務則把新任務加入到運行隊列的隊尾,由內(nèi)核分配CPU時間片和內(nèi)存資源,與其他的任務一起進行多任務的并發(fā)處理;如果新任務運行級別最低則將被放入到系統(tǒng)等待隊列中,直到其他任務處理完成再處理新任務。判斷流程如圖3示:
圖3運行級別判斷流程圖
3嵌入式開發(fā)環(huán)境構(gòu)建
完整的嵌入式開發(fā)環(huán)境由嵌入式目標板和宿主機構(gòu)成,兩者通過網(wǎng)線、計算機串口和JTAG連接。用戶程序在宿主機平臺上進行開發(fā),交叉編譯過的程序燒寫到開發(fā)板中的Flash芯片中。
3.1宿主機
宿主機安裝Redhat9.0操作系統(tǒng)、MiniGUI開發(fā)環(huán)境和開發(fā)工具集。工具集包括交叉編譯器gcc、調(diào)試器gdb、C函數(shù)庫glibc和二進制工具集binutils。
3.2 目標板
1)引導程序(Boot Loader)
是系統(tǒng)復位后執(zhí)行的一段代碼,首先完成系統(tǒng)硬件的初始化,包括時鐘設置、存儲區(qū)影射等,然后跳轉(zhuǎn)到操作系統(tǒng)內(nèi)核的入口,將系統(tǒng)控制權(quán)交給操作系統(tǒng)。 Boot Loader獨立于操作系統(tǒng)而高度依賴系統(tǒng)硬件,必須自行設計。本文采用vivi作為系統(tǒng)的引導程序。其啟動分為兩個階段:第一階段代碼采用匯編語言編寫,主要進行與CPU以及存儲設備密切相關的工作,并進行初始化;第二階段采用C語言編寫,來實現(xiàn)一般的流程及對板級的一些驅(qū)動支持。
2)Linux內(nèi)核
一般的嵌入式操作系統(tǒng)如uClinux、uC/OS-II通常運行在沒有MMU的CPU上,因此在進程編程時具有較大的困難度,所以選擇具有完整 Unix特性的Linux作為操作系統(tǒng)。開發(fā)板采用打過補丁的Linux-2.4.18-rmk7的內(nèi)核,內(nèi)核和補丁可以從ARM的官方網(wǎng)站上下載。在配置內(nèi)核時去掉無關的功能以減少內(nèi)核大小,如SCSI、IrDA、手柄等。
3)根文件系統(tǒng)
嵌入式根文件系統(tǒng)(root filesystem)是嵌入式Linux系統(tǒng)的核心部分 ,包含系統(tǒng)使用的軟件和庫,以及所有用來為用戶提供支持架構(gòu)和用戶使用的應用軟件,并作為存儲區(qū)讀寫結(jié)果的區(qū)域。
[!--empirenews.page--]
4多進程GUI的實現(xiàn)
基于以上分析,本圖形用戶界面系統(tǒng)采用微C/S機制,用共享內(nèi)存的進程間通信機制實現(xiàn)數(shù)據(jù)交換,通過套接字實現(xiàn)客戶程序與服務器程序通信。服務器程序?qū)崿F(xiàn)窗口結(jié)構(gòu)隊列管理,獲取系統(tǒng)產(chǎn)生的鼠標和鍵盤消息并進行分發(fā)??蛻暨M程從IPC消息隊列獲取發(fā)往自己的消息,并通過共享內(nèi)存實現(xiàn)窗口剪切。
經(jīng)過交叉編譯的可執(zhí)行圖形應用程序可以通過NFS下載到開發(fā)板,然后通過串口調(diào)試工具進行遠程調(diào)試。在應用程序調(diào)試完成后將裁減后的MiniGUI 的函數(shù)庫、配置文件放到為開發(fā)板準備的根文件系統(tǒng)中,并把主界面的可執(zhí)行文件加入到文件系統(tǒng)的啟動腳本,用重新得到的根文件系統(tǒng)生成鏡像文件,然后燒寫到開發(fā)板Flash上,在開發(fā)板啟動后即可以進入到圖形界面。該系統(tǒng)在嵌入式開發(fā)平臺上能夠?qū)崿F(xiàn)多窗口運行,并且在調(diào)用產(chǎn)生高任務級別的任務時能夠順利實現(xiàn)任務掛起功能。
5結(jié)束語
目前嵌入式產(chǎn)品的在功能實現(xiàn)上日益復雜化,簡單的圖形用戶界面系統(tǒng)已經(jīng)很難滿足用戶的實際需要,比如將來的智能手機將融入電子地圖、定位導航系統(tǒng)、 PDA、電子字典、多媒體播放等多功能,單一的窗口操作界面顯然不符合用戶要求?;诙?strong>進程的GUI系統(tǒng)能夠?qū)崿F(xiàn)多任務、支持多窗口,并且具有良好的系統(tǒng)穩(wěn)定性,因此必然是嵌入式產(chǎn)品開發(fā)的一個重點,也是未來嵌入式圖形用戶界面的發(fā)展方向。
參考文獻
[1] 周立功等. ARM嵌入式MiniGUI初步與應用開發(fā)范例[M].北京:北京航空航天大學出版社, 2006。
[2] David Mosberger, Stephane Eranian,IA-64 Linux Kernel Design and Implementation[M]。Prince Hall, Jan 30, 2002
[3] MiniGUI編程指南 V2.0 [Z]。http://www.minigui.com
[4] MiniGUI API Reference Manual for V1.3 [Z]. http://www.minigui.com
[5] 鄭樺,劉清,邢航,徐智穹。構(gòu)造嵌入式Linux的文件系統(tǒng)[J]。微計算機信息,2004,20(8):49~50