摘要:本文主要討論了基于Linux的嵌入式系統(tǒng)的研究與開發(fā)。通過對通常嵌入式Linux操作系統(tǒng)的原理和實現(xiàn)方式的分析,針對具體的MiniGUI,分析了其體系結構和關鍵技術。
關鍵詞:嵌入式 Linux MiniGUI
一 嵌入式Linux概述
自從1991年首次公開發(fā)表以來,Linux的應用范圍越來越廣泛。Linux常用來指Linux內(nèi)核、Linux系統(tǒng)或Linux發(fā)行套件。當Linux內(nèi)核為了特殊的硬件配置或者支持特定的應用,經(jīng)過特別的裁剪,這樣就成為了嵌入式Linux系統(tǒng)。
二 嵌入式Linux系統(tǒng)下MiniGUI
隨著Linux的廣泛應用,PDA、機頂盒、DVD/VCD播放機及WAP手機已經(jīng)迅速普及。圖形用戶界面(GUI)的廣泛流行,是當今計算機技術的重大成就之一。它極大地方便了非專業(yè)用戶的使用,因此實時嵌入式系統(tǒng)對GUI的需求越來越明顯,而這一切均要求有一個高性能、高可靠的GUI的支持。
由于Linux系統(tǒng)實時性要求非常高,對GUI的要求也更高。這些系統(tǒng)一般不希望建立在龐大累贅的、非常消耗系統(tǒng)資源的操作系統(tǒng)和GUI之上,比如Windows,太過龐大和臃腫。這樣,這些系統(tǒng)對輕型GUI的需求更加突出。另外嵌入式系統(tǒng)往往是一種定制設備,它們對GUI的需求也各不相同。有些系統(tǒng)只要求一些圖形功能,而有些系統(tǒng)要求完備的GUI支持,因此,GUI也必須是可定制的。嵌入式系統(tǒng)對GUI的基本要求包括輕型、占用資源少、高性能、高可靠性及可配置。
三 MiniGUI的體系結構
3.1多線程的分層設計
GAL和IAL為MiniGUI提供了底層的Linux控制臺或者XWindow上的圖形接口以及輸入接口,而Pthread是用于提供內(nèi)核級線程支持的C函數(shù)庫。MiniGUI本身運行在多線程模式下,它的許多模塊都以單獨的線程運行,同時,MiniGUI還利用線程來支持多窗口。從本質(zhì)上講,每個線程有一個消息隊列,消息隊列是實現(xiàn)線程數(shù)據(jù)交換和同步的關鍵數(shù)據(jù)結構。一個線程向消息隊列中發(fā)送消息,而另一個線程從這個消息隊列中獲取消息,同一個線程中創(chuàng)建的窗口可共享同一個消息隊列。利用消息隊列和多線程之間的同步機制,可以實現(xiàn)下面要講到的微客戶/服務器機制。多線程有其一定的好處,但不方便的是不同的線程共享了同一個地址空間,因此,客戶線程可能會破壞系統(tǒng)服務器線程的數(shù)據(jù),但有一個重要的優(yōu)勢是,由于共享地址空間,線程之間就沒有額外的數(shù)據(jù)復制開銷。由于MiniGUI是面向嵌入式或?qū)崟r控制系統(tǒng)的,因此,這種應用環(huán)境下的應用程序往往具有單一的功能,從而使得采用多線程而非多進程模式實現(xiàn)圖形界面有了一定的實際意義,也更加符合MiniGUI之“mini”的特色。目前,MiniGUI開發(fā)組準備開發(fā)出基于多進程客戶/服務器機制的類XWindow的API,以便用于不同的應用環(huán)境。
3.2微客戶/服務器結構
在多線程環(huán)境中,與多進程間的通訊機制類似,線程之間也有交互和同步的需求。比如,用來管理窗口的線程維持全局的窗口列表,而其他線程不能直接修改這些全局的數(shù)據(jù)結構,而必須依據(jù)“先來先服務”的原則,依次處理每個線程的請求,這就是一般性的客戶/服務器模式。MiniGUI利用線程之間的同步操作實現(xiàn)了客戶線程和服務器線程之間的微客戶/服務器機制,之所以這樣命名,是因為客戶和服務器是同一進程中的不同線程。微客戶/服務器機制的核心實現(xiàn)主要集中在消息隊列數(shù)據(jù)結構上。
當MiniGUI在初始化全局數(shù)據(jù)結構以及各個模塊之后,MiniGUI要啟動幾個重要的微服務器,它們分別完成不同的系統(tǒng)任務:
①desktop用于管理MiniGUI窗口中的所有主窗口,包括建立、銷毀、顯示、隱藏、修改Z-order、獲得輸入焦點等等。
②parsor線程用來從IAL中收集鼠標和鍵盤事件,并將收集到的事件轉換為消息而郵寄給desktop服務器。
③timer線程用來觸發(fā)定時器事件。該線程啟動時首先設置Linux定時器,然后等待desktop線程的結束,即處于體眠狀態(tài)。當接收到SIGALRM信號時,該線程處理該信號并向desktop服務器發(fā)送定時器消息。當desktop接收到定時器消息時,desktop會查看當前窗口的定時器列表,如果某個定時器過期,則會向該定時器所屬的窗口發(fā)送定時器消息。
四 MiniGUI的關鍵技術
(1)多線程和多窗口
MiniGUI中的窗口基本分四類,分別為主窗口、對話框、控件和主窗口中的子窗口。MiniGUI中的主窗口和Windows應用程序的主窗口概念類似,但有一些重要的不同,MiniGUI中的每個主窗口及其附屬主窗口對應于一個單獨的線程,通過函數(shù)調(diào)用可建立主窗口以及對應的線程。
(2)對話框和標準控件
MiniGUI中的對話框是一種特殊的窗口,對話框一般和控件一起使用,這兩個概念和Windows或XWindow中的相關概念是類似的。MiniGUI支持的控件類型有:
①靜態(tài)框:文本、圖標或矩形框等。
②文本框:單行或多行的文本編輯框。
③按鈕:單選鈕、復選框和一般按鈕等。
④列表框。
⑤進度條。
(3)其他GUI元素
MiniGUI還支持級聯(lián)式菜單、插入符、定時器、光標、快捷鍵等常見的GUI元素。
(4)消息和消息循環(huán)
在任何GUI系統(tǒng)中,均有事件或消息驅(qū)動的概念。在MiniGUI中,使用消息驅(qū)動作為應用程序的創(chuàng)建構架。在消息驅(qū)動的應用程序中,計算機外設發(fā)生的事件,例如鍵撇鍵的敲擊、鼠標鍵的按擊等,都由支持系統(tǒng)收集,將其以事先的約定格式翻譯為特定的消息。
應用程序一般要提供一個處理消息的標準函數(shù)。在消息循環(huán)中,系統(tǒng)可以調(diào)用此函數(shù),應用程序在此函數(shù)中處理相應的消息。MiniGUI支持如下幾種消息的傳遞機制。這些機制為多線程環(huán)境下的窗口間通訊提供了基本途徑:
①通過PostMessage發(fā)送。消息發(fā)送到消息隊列后立即返回。這種發(fā)送方式稱為“郵寄”消息。如果消息隊列中的郵寄消息緩沖區(qū)已滿,則該函數(shù)返回錯誤值。
②通過PostSyncMessage發(fā)送。該函數(shù)用來向不同于調(diào)用該函數(shù)的線程消息隊列郵寄消息,并且只有該消息被處理之后,該函數(shù)才能返回,因此這種消息稱為“同步消息”。
③通過SendMessage發(fā)送。該函數(shù)可以向任意一個窗口發(fā)送消息,消息處理完成之后,該函數(shù)返回。如果目標窗口所在線程和調(diào)用線程是同一個線程,該函數(shù)直接調(diào)用窗口過程,如果處于不同的線程,則利用PostSyncMessage函數(shù)發(fā)送同步消息。
④通過SendNotifyMessage發(fā)送。該函數(shù)向指定的窗口發(fā)送通知消息,將消息放入消息隊列后立即返回。由于這種消息和郵寄消息不同,是不允許丟失的,因此,系統(tǒng)以鏈表的形式處理這種消息。
⑤通過SendAsyncMessage發(fā)送。利用該函數(shù)發(fā)送的消息稱為“異步消息”,系統(tǒng)直接調(diào)用目標窗口的窗口過程。
參考文獻:
[1] 鄒思軼.嵌入式Linux設計與應用.清華大學出版社.2002年1月.第一版
[2] 馮銳等譯.Linux內(nèi)核源代碼分析.機械工業(yè)出版社.2000年.第二版
[3] 鄒勇,王青和李明樹.Linux內(nèi)核的實時支持的研究與實現(xiàn).計算機研究與發(fā)展.2002年.第四期
[4] William Stallings.操作系統(tǒng)-內(nèi)核與設計原理.電子工業(yè)出版社2001第4版.P336-346
作者:
劉書剛華北電力大學計算機系