新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于ulTRON操作系統(tǒng)的嵌入式GUI設(shè)計

基于ulTRON操作系統(tǒng)的嵌入式GUI設(shè)計

——
作者:東南大學(xué) 凌明 浦漢來 張宇 時間:2007-01-26 來源:單片機及嵌入式系統(tǒng)應(yīng)用 收藏
隨著技術(shù)的不斷發(fā)展,各類嵌入式應(yīng)用對人機交互界面的要求也越來越高,這就使得對嵌入式圖形用戶界面的需求越來越迫切。與一般系統(tǒng)上的圖形用戶界面相比,圖形用戶界面要求輕型、占用資源少、高性能、高可靠性、可配置等特點。

本設(shè)計是在東南大學(xué)國家專用集成電路系統(tǒng)工程技術(shù)研究中心自主研發(fā)的,并在遵循uITRON 3.0標(biāo)準(zhǔn)的RTOS-ASIX OS基礎(chǔ)上設(shè)計出一套適合于手持設(shè)備、儀器儀表等應(yīng)用的圖形用戶界面一一ASIX Window。該圖形用戶界面采用面向?qū)ο蟮脑O(shè)計思想,基于消息循環(huán)和事件驅(qū)動機制,構(gòu)建了比較完整的窗口系統(tǒng),為用戶提供了類Win32 API的用戶編程接口??紤]到一般嵌入式應(yīng)用的屏幕較小,以及處理器與存儲器容量的限制,ASIX Window在設(shè)計上放棄了窗口剪切等復(fù)雜特性,大大降低了系統(tǒng)的復(fù)雜性,減少了對系統(tǒng)資源的占用。由于采用基于控件的設(shè)計概念,ASIX Window非常適合裁減,可以根據(jù)用戶的需求方便地增加或刪減控件,增加了系統(tǒng)的可裁減性。該圖形用戶界面已成功應(yīng)用于PDA,電子詞典,稅控收款機等多款產(chǎn)品設(shè)計中。

1 與操作系統(tǒng)內(nèi)核的接口
ASIX Window的整體架構(gòu)是基于消息分發(fā),消息循環(huán)以及消息處理之上的。整個ASIX OS平臺的結(jié)構(gòu)如圖1所示。圖1中,最底層的是系統(tǒng)的消息源,包括中斷(鍵盤、觸摸屏等)和定時器,一般將它們統(tǒng)稱為中斷源。中斷發(fā)生后,進(jìn)入中斷處理程序,該中斷處理程序維護(hù)其對應(yīng)的緩沖區(qū)后(如果它需要緩沖區(qū)),設(shè)置事件發(fā)生(通過調(diào)用內(nèi)核的事件標(biāo)志系統(tǒng)調(diào)用)。因為系統(tǒng)任務(wù)是阻塞在這個事件標(biāo)志上的,而且系統(tǒng)任務(wù)的優(yōu)先級最高,系統(tǒng)任務(wù)將被內(nèi)核調(diào)度運行,系統(tǒng)任務(wù)根據(jù)所發(fā)生事件的類型,來進(jìn)行相應(yīng)的處理。比如說,如果是筆中斷事件,中斷處理程序?qū)⒐P的坐標(biāo)信息存放在相應(yīng)的緩沖區(qū)中,并設(shè)置相應(yīng)的事件標(biāo)志,系統(tǒng)任務(wù)將筆坐標(biāo)的數(shù)據(jù)轉(zhuǎn)換為相應(yīng)活動區(qū)域(Active Area)的消息,并由系統(tǒng)任務(wù)將這個消息發(fā)送到當(dāng)前需要該中斷事件的任務(wù)中。LCD顯示,鍵盤和筆中斷一定是由前臺任務(wù)(擁有屏幕的任務(wù))接管的,其他外圍設(shè)備所對應(yīng)的中斷源則由占用該資源的任務(wù)接管。


每個任務(wù)都有一個自己的信箱(Mail B0x),在每個信箱上都維護(hù)著一條消息隊列,所有發(fā)往該任務(wù)的消息都連接在這個隊列中。任務(wù)代碼應(yīng)該通過消息循環(huán)不斷地從該隊列中取消息并處理,如果消息隊列為空,則該任務(wù)阻塞,由ASIX OS內(nèi)核選擇下一個就緒的高優(yōu)先級任務(wù)運行。

系統(tǒng)任務(wù)是內(nèi)核的擴展,提供系統(tǒng)基本的服務(wù)功能和接口。它接管系統(tǒng)所有的中斷資源并將相應(yīng)的中斷事件翻譯成為相應(yīng)的系統(tǒng)消息,并將該消息分發(fā)到對應(yīng)的應(yīng)用程序任務(wù);系統(tǒng)任務(wù)同時維護(hù)系統(tǒng)中所有任務(wù)的信息,負(fù)責(zé)確定前臺任務(wù)(擁有顯示屏幕和用戶輸入焦點的任務(wù),前臺任務(wù)不一定是CPU正在運行的任務(wù))以及前臺任務(wù)的切換。系統(tǒng)任務(wù)阻塞在底層中斷的事件標(biāo)志上,系統(tǒng)任務(wù)擁有最高的優(yōu)先級。

在系統(tǒng)任務(wù)之上是服務(wù)任務(wù)。服務(wù)任務(wù)負(fù)責(zé)提供系統(tǒng)的其他擴展服務(wù)。服務(wù)任務(wù)沒有屏幕顯示(類似于Linux中的守護(hù)進(jìn)程),服務(wù)任務(wù)阻塞在自己的消息隊列
上。服務(wù)任務(wù)擁有第二高的優(yōu)先級。

應(yīng)用程序任務(wù)是用戶使用的各個應(yīng)用。應(yīng)用任務(wù)阻塞在自己的消息隊列上,所有的應(yīng)用程序一般都應(yīng)該擁有屏幕顯示,所有的應(yīng)用程序在同一優(yōu)先級上。

2 窗口管理
ASlX Windows是基于消息驅(qū)動的圖形用戶接口。從ASIXWindows的角度來看,應(yīng)用程序是由一組窗口和控件組成的,程序的功能是通過窗口的操作來實現(xiàn)的??丶窃贏SIX Windows中定制的具有特定功能的獨立模塊,例如:按鈕、菜單、下拉框、軟鍵盤等。在ASIX Windows中,每一個控件在數(shù)據(jù)結(jié)構(gòu)上都被描述為一個窗口(也就是說,在數(shù)據(jù)結(jié)構(gòu)上,窗口和控件是一樣的),不同的是,控件是作為某個窗口的子窗口。在數(shù)據(jù)結(jié)構(gòu)上將窗口與控件統(tǒng)一,使得整個系統(tǒng)的結(jié)構(gòu)更簡單,對窗口的操作與對控件的操作可以統(tǒng)一到一起,這使得系統(tǒng)的編程接口可以統(tǒng)一到窗口的操作函數(shù)上。在ASIX Windows中所有的窗口操作,不管是窗口或是控件,都使用這些統(tǒng)一的函數(shù)。系統(tǒng)通過下面這個統(tǒng)一的數(shù)據(jù)結(jié)構(gòu)來對所有的控件進(jìn)行管理。

typedef struct asix_window
{ struct asix window *prey}//指向前一個兄弟窗口
struct asix_window *next;//指向后一個兄弟窗口
struct asix_window *child;//指向子窗口鏈表
/*本窗口的相關(guān)ID*/
WNDCLASS *wndclass;//指向本窗口的窗口類
U32 task_id; //本窗口所屬任務(wù)的任務(wù)號
U32 wnd_id; //本窗口ID號
U32 parent_id; //本窗口的父窗口 ID號
/*本窗口的位置、狀態(tài)、風(fēng)格以及窗口標(biāo)題等*/
U32 status; //本窗口狀態(tài)
U16 x; //本窗口左上角x坐標(biāo)
U16 v; //本窗口左上角Y坐標(biāo)
U16 width; //本窗口的寬度
U16 hight; //本窗口的高度
char *caption} //本窗口標(biāo)題
U32 style; //本窗口風(fēng)格
/*指向本窗口私有數(shù)據(jù)結(jié)構(gòu)的指針*/
void *etrl_str; //指向本窗口的私有數(shù)據(jù)結(jié)構(gòu)
}ASIX_WINDOW;

實際上,不同的控件擁有不同的功能和結(jié)構(gòu),所以它們的操作是不同的。為了擁有統(tǒng)一的操作函數(shù)接口,為每一個不同的窗口或控件定義了相應(yīng)的窗口類,窗口類實際上是每種控件的模版,這個模版定義了與該控件相關(guān)的內(nèi)容。當(dāng)應(yīng)用程序員調(diào)用CreatWindow函數(shù)創(chuàng)建某類控件時,CreatWindow查找該類控件的窗口類,并根據(jù)窗口類中的定義,調(diào)用與該控件相關(guān)的創(chuàng)建函數(shù),進(jìn)行實際的創(chuàng)建工作。然后CreatWindow填寫相應(yīng)的數(shù)據(jù)結(jié)構(gòu),描述該控件類的實例,并將其鏈接到系統(tǒng)窗口鏈表中去,以便后續(xù)的管理。利用窗口類描述不同控件設(shè)計的同時,可以將不同控件的開發(fā)獨立于系統(tǒng)構(gòu)架的實現(xiàn),使得控件的開發(fā)可以獨立進(jìn)行。使用獨立窗口類來描述每個控件的另一個好處是可以非常方便的對ASIX Window進(jìn)行裁減。下面給出窗口類數(shù)據(jù)結(jié)構(gòu)的定義。

typedef struct window_class
{ U8 wndclass_id; //窗口類的ID號
//CreateWindow()調(diào)用本函數(shù)執(zhí)行控件的具體創(chuàng)建
STATUS (。create)(char‘caption,U32 style,U16 x,
U16 Y,U16 width,U16 hight,U32 wndid,U32 menH,void*
*etrl_str,void*exdata);
//DestroyWindow()調(diào)用本函數(shù)執(zhí)行控件的具體刪除
STATUS (*destroy)(void*ctrl_str);
//DefWindowProc()調(diào)用本函數(shù)進(jìn)行消息處理
STATUS (。msg_proe)(U32 win_id,U16 asix_msg



關(guān)鍵詞: 單片機 嵌入式系統(tǒng)

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉