<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 嵌入式多任務(wù)GUI的通用解決方案

嵌入式多任務(wù)GUI的通用解決方案

作者: 時(shí)間:2008-01-07 來(lái)源:網(wǎng)絡(luò ) 收藏
摘要 針對系統需要非常強的靈活性、可移植性和可伸縮性的特點(diǎn).提出一種;采用層次化、模塊化和面向對象的設計思想,給出了的體系結構,并對多設計中的多調度策略及管理、消息驅動(dòng)機制、桌面廈窗口管理和對象樹(shù)等關(guān)鍵技術(shù)進(jìn)行了研究。該的原型已經(jīng)成功應用于我國自主產(chǎn)權的實(shí)時(shí)操作系統DeltaOS中。
關(guān)鍵詞 系統GUI圖形用戶(hù)界面 多任務(wù)


嵌入式GUI(Graphic Uset Interface)系統就是在嵌入式系統中為特定的硬件設備或環(huán)境而設汁的圖形用戶(hù)界面系統。調查顯示,越來(lái)越多具有靈活性、高效性和可移植性的嵌入式GUI系統被廣泛應用于辦公自動(dòng)化、消費電子、通信設備、智能儀器等許多領(lǐng)域;而且隨著(zhù)硬件技術(shù)的發(fā)展,要求GUI實(shí)現的功能越來(lái)越豐富,GUI系統也變得比以往更加復雜、多樣。
大多數的嵌入式GUI系統都只能簡(jiǎn)單地支持單任務(wù)。單任務(wù)GUI的效率較低,無(wú)法滿(mǎn)足未來(lái)GUI的發(fā)展需求,故多任務(wù)GUI是嵌入式GUI的發(fā)展方向。
目前,在嵌入式應用領(lǐng)域比較成功的嵌入式多任務(wù)GUI系統主要有:MiniGUI、MicroWindows和Qt/Em-bedded。它們主要是針對嵌入式Linux而設計的,通過(guò)PThrred庫來(lái)實(shí)現對多線(xiàn)程的支持;而PThred本身就比較復雜,很難將這些GUI系統移植到平臺接口不符合POSIX標準的目標平臺上。所以,上述幾種GUI系統有一個(gè)共同的缺點(diǎn),就是過(guò)分地依賴(lài)于某種特定的平臺,導致可移植性差。
為了有效地兼容嵌入式領(lǐng)域的各種環(huán)境,下面提出一種、有效并且可移植性好的嵌入式GUI體系結構,并對多任務(wù)GUI設汁中的關(guān)鍵技術(shù)進(jìn)行研究。


1 體系結構
針對GUI需要非常強的靈活性,可移植性和可伸縮性的特點(diǎn),在其體系結構的設計中,采用層次化、模塊化和面向對象的設計思想。層次式的體系結構在許多軟件系統中被采用,被公認為是一種合理的結構,但最重要的是如何來(lái)劃分這些層次,使系統的結構最合理、最清晰。
在設計中采用如下劃分策略:力求層次之間相對獨立,對任一層的改動(dòng)保證它對上層的接口不變,上層不受下層變化的影響。在這樣的層次結構中,最底層和最高層都可能根據具體需要發(fā)生改變,因此應該為這兩層提供充分的變動(dòng)空間,而中間的層次則應是獨立不變的。
GUI在嵌入式應用環(huán)境中,硬件環(huán)境、操作系統和用戶(hù)應用程序之間的層次如圖1所示。圖1中,通過(guò)驅動(dòng)程序,GUI組件部分與硬件隔離;通過(guò)操作系統抽象層,使核心與具體操作系統隔離。這種層次體系結構使得GUI具有良好的平臺無(wú)關(guān)性,在不同的操作系統和硬件平臺之間的移植非常方便。按上述設計思想,GUI層次模型劃分如圖2所示。圖中,GUI被劃分為3層,每一層義根據具體功能的不同被劃分為幾個(gè)模塊。

1.1 輸入輸出層
這一層的功能是將系統中設備和操作系統平臺的具體細節屏蔽起來(lái)。該設備層被定義在BSP中,向上提供GUI對沒(méi)備的顯示特性操作。該層分為設備邏輯和硬件抽象兩個(gè)子層。設備邏輯子層使用同一類(lèi)設備的概念來(lái)描述GUI支持的外部設備及對該設備的邏輯操作,向上層提供了統一的設備操作接口;而硬件抽象子層則利用實(shí)際的設備控制器操作,根據硬件在不同平臺上的驅動(dòng)來(lái)實(shí)現硬件抽象子層中定義的接口。
1.2 窗口核心層
窗口核心層實(shí)現GUI的關(guān)鍵功能,根據功能可劃分為消息管理、緩沖池管理、作圖管理、定時(shí)器、資源管理、對象管理、子屏管理和內存堆管理等幾部分。
由于GUI采取消息驅動(dòng)的通信方式,因此消息管理構成GUI的靈魂,通過(guò)它把系統的各個(gè)部分聯(lián)系起來(lái)。在應用程序的運行過(guò)程中,消息承載了系統各部分間的交換信息。
內存堆管理:目的是避免在系統運行過(guò)程中動(dòng)態(tài)分配和釋放內存時(shí)引起存儲碎片。兩個(gè)比較頻繁的動(dòng)態(tài)內存分配操作是消息空間的申請/釋放和屏幕對象剪切域的刷新。
作圖管理:完成畫(huà)點(diǎn)、畫(huà)線(xiàn)、畫(huà)圓等作圖操作。為了提高GUI的移植性,這層主要完成與硬件無(wú)關(guān)的作圖過(guò)程。對具有特殊顯示功能的應用平臺來(lái)說(shuō),此層也可以大量調用硬件提供的功能函數(經(jīng)輸出硬件無(wú)關(guān)層包裝后的接口),從而實(shí)現特殊的作圖效果。GUI在結構上提供了這種靈活性。作圖管理層向上以作圖原語(yǔ)集的形式為應用提供調用接口。
定時(shí)器:根據系統時(shí)鐘來(lái)為應用提供計數信息。
資源管理:主要對字體、圖片和調色板等進(jìn)行管理,需要實(shí)現資源的存儲以及為應用提供適當的接口兩大功能。
對象管理:采取合理的機制來(lái)組織在屏幕上顯示的對象。GUI把所有能在屏幕上顯示的GUI元素稱(chēng)為“對象”,并通過(guò)對象樹(shù)、Z序和剪切域等機制來(lái)實(shí)現對象的管理。窗口核心層還為應用提供了添加、刪除、隱藏對象等操作接口函數。
1.3 應用接口層
應用接口層封裝了GUI為用戶(hù)提供的一切接口,應用程序看到的GUI就是此層提供的所有接口函數,包括工具箱、作圖原語(yǔ)集和對象操作集等3部分。
工具箱:GUI為用戶(hù)提供的控件集。這部分的大小是可根據應用的需要調整的,從而也在較大程度上影響了GUI庫的大小。常用的控件有按鈕、滾動(dòng)條、窗口和編輯框等。
作圖原語(yǔ)集:作圖管理層提供的繪圖函數接口。工具箱也是在它的基礎上實(shí)現的。
對象操作集:主要實(shí)現GUI對象的添加和刪除等操作功能。

2 多任務(wù)GUI關(guān)鍵技術(shù)分析
本文中提到的“任務(wù)”,在同一個(gè)地址空間執行并且可以無(wú)約束地直接訪(fǎng)問(wèn)所有的共享資源。下面對多任務(wù)GUI設計中的關(guān)鍵技術(shù)進(jìn)行分析。
2.1 多任務(wù)調度策略及管理
多任務(wù)系統需要一個(gè)合理的任務(wù)調度策略來(lái)管理所有的任務(wù)。啟動(dòng)GUI后,會(huì )默認產(chǎn)牛一個(gè)系統任務(wù)、一個(gè)事件任務(wù)和一個(gè)定時(shí)器任務(wù);而應用任務(wù)的產(chǎn)生則要根據具體的用戶(hù)需求。
(1)系統任務(wù)
桌面對象運行的任務(wù)稱(chēng)為“系統任務(wù)”。系統任務(wù)是整個(gè)圖形用戶(hù)系統運轉的核心。它不斷地從系統的主消息隊列中取消息,并按消息的目的和用途將其派發(fā)到對應的目的任務(wù);同時(shí)負責所有應用任務(wù)的管理和維護以及桌面管理等事務(wù)。一個(gè)系統中僅有一個(gè)系統任務(wù)。
(2)事件任務(wù)
事件任務(wù)負責收集外部事件,并將事件解釋為與之對應的GUI消息,并放入系統的主消息隊列中。用戶(hù)的輸入正是從這里傳人GUI核心進(jìn)行處理。一般情況下,一個(gè)系統中僅有一個(gè)事件任務(wù)。
(3)定時(shí)器任務(wù)
定時(shí)器任務(wù)是通過(guò)操作系統的系統調用產(chǎn)生GUI定時(shí)器的。
(4)應用任務(wù)
除系統任務(wù)之外,窗口所運行的其他任務(wù)稱(chēng)為“應用任務(wù)”。應用任務(wù)是用戶(hù)程序運行的基本單位。應用邏輯都在此任務(wù)中運行,擁有自己的消息隊列,接收來(lái)自GUI核心的消息,按一定規則獨立進(jìn)行消息循環(huán)。應用任務(wù)通過(guò)消息與系統任務(wù)交互,受系統任務(wù)的管理;通過(guò)應用接口層使用系統的軟硬件資源。應用任務(wù)的上限數目?jì)H受平臺的資源數目限制。
在嵌入式GUI中,系統任務(wù)被賦予最高的優(yōu)先權,其他任務(wù)可使用低于系統任務(wù)優(yōu)先級的不同優(yōu)先級;相同優(yōu)先級應采用時(shí)間片輪轉方式運行??傊?,如果有必要,則嵌入式GUI系統會(huì )同時(shí)采取時(shí)間片輪轉和優(yōu)先級搶占的任務(wù)調度策略,如圖3所示。

在沒(méi)有消息到達或者在等待某個(gè)事件時(shí),任務(wù)需要將自己掛起。一旦有消息進(jìn)入消息隊列,任務(wù)將會(huì )被喚醒以處理消息。這樣,有限的CPU資源就能夠被充分地利用。
此外,系統任務(wù)維護一個(gè)用于跟蹤及管理應用任務(wù)的列表。每一個(gè)應用任務(wù)對應一個(gè)包含其屬性信息的任務(wù)信息塊。任務(wù)屬性包括消息隊列指針、任務(wù)句柄和任務(wù)入口等,對指定任務(wù)進(jìn)行了詳細的描述。一個(gè)信息塊的創(chuàng )建與銷(xiāo)毀必須與應用任務(wù)的創(chuàng )建與銷(xiāo)毀保持同步。系統任務(wù)必須維護該列表,以保證這些信息塊的正確性。多任務(wù)管理機制如圖4所示。
對用戶(hù)來(lái)說(shuō),只需要簡(jiǎn)單地指定任務(wù)的入口和優(yōu)先級(如果有必要的話(huà)),其他所有的工作都由系統任務(wù)自動(dòng)完成。采用這種調度和管理方法,能使系統變得更加易用和高效。
2.2 消息驅動(dòng)機制
消息機制的提出,最初是為了解決早期程序設計中基于硬件中斷的事件處理問(wèn)題。中斷事件的發(fā)生足不可預期的、突發(fā)性的,因此當有多個(gè)應用等待并處理中斷事件時(shí),就會(huì )出現問(wèn)題。消息機制可以很好地解決事件驅動(dòng)的多應用設計問(wèn)題,并且可以形成一種處理多個(gè)系統之間、系統內部件和部件之問(wèn)關(guān)系的簡(jiǎn)潔而且可靠的方法。
在只支持單任務(wù)的GUI系統中只有一個(gè)串行化的消息隊列,消息嚴格地按照順序處理,導致響應慢、效率低,故有必要采用并行化的消息隊列。當一個(gè)隊列中的消息忙于處理一個(gè)冗長(cháng)工作時(shí),輸入焦點(diǎn)能夠切換到另外一個(gè)隊列。
系統維護一個(gè)系統消息隊列和多個(gè)指定任務(wù)信息隊列,每個(gè)指定任務(wù)信息隊列對應一個(gè)應用任務(wù),如圖5所示。事件任務(wù)將輸入轉化成消息并將其放入系統消息隊列中,系統任務(wù)檢索到輸入消息后首先會(huì )對該消息進(jìn)行檢查,然后將消息郵寄給目標應用任務(wù)或直接對消息進(jìn)行處理。每個(gè)應用任務(wù)從它的消息隊列中移出消息,并將其發(fā)送到適當的窗口程序中進(jìn)行處理。一個(gè)應用任務(wù)可以將消息郵寄到它自己的消息隊列,也可以郵寄到其他應用任務(wù)的消息隊列中。

此外,為了達到不同的目的,系統提供了同步和異步兩種基本類(lèi)型的消息。
2.3 桌面及窗口管理
屏幕中的窗口通常是相互覆蓋,而且它們的相對位置也在不斷地變動(dòng)。這些窗口有可能分別屬于不同的任務(wù),但共享一個(gè)相同的屏幕。所以,如何方便并有效地計算和維護窗口便顯得很重要。
首先介紹2個(gè)概念:全局剪切域和窗口剪切域。它們都與應用任務(wù)相關(guān),前者指出哪些區域占據屏幕,后者給出在相同的應用任務(wù)中所有對象的剪切關(guān)系。
系統任務(wù)除了要維護它自己的剪切域外,還要負責管理所有應用任務(wù)的全局剪切域,如圖6所示。一旦窗口位置發(fā)生變化,系統任務(wù)必須更新信息并且通知應用任務(wù)作出相應的變動(dòng)。另一方面,在計算窗口剪切域時(shí),應用任務(wù)只須關(guān)心它本身而不受其他任務(wù)的影響,好像整個(gè)屏幕只有它一個(gè)任務(wù)在運行。至于最后實(shí)際的剪切結果,只需將全局剪切和窗口剪切結果進(jìn)行“與”運算。

2.4 Z序和對象樹(shù)
Z序實(shí)際定義了屏幕中對象集(可顯窗口)之間的層次關(guān)系。GUI用戶(hù)可以通過(guò)選擇要被置于前端的窗口來(lái)改變Z序。很多GUI系統將Z序當作一個(gè)帶有指定運算集的顯式列表來(lái)實(shí)現。然而,在嵌入式GUI系統中不用這種方式,而是通過(guò)對象樹(shù)來(lái)說(shuō)明這些GUI對象之間的層次關(guān)系和Z序。理論上,每一個(gè)GUI對象都有父親、孩子和兄弟。因此,所有顯示在屏幕上的對象便構成一棵以桌面為根節點(diǎn)的倒置樹(shù)。對樹(shù)進(jìn)行“后根遍歷”就能夠容易地得到Z序。
圖7描述了對象樹(shù)的建立過(guò)程。對象樹(shù)的采用極大地簡(jiǎn)化了桌面管理,能夠在不增加額外工作的情況下方便地組合對象和實(shí)現Z序管理。

3 小 結
將來(lái)的GUI系統將越來(lái)越復雜,要求GUI系統實(shí)現的功能也越來(lái)越豐富,這就需要一個(gè)更加開(kāi)放且伸縮性好的體系結構。本文提出的嵌入式GUI體系結構具有很強的靈活性,且可移植性好,能夠很好地應用于嵌入式領(lǐng)域的各種環(huán)境。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>