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