<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è) > 嵌入式系統 > 設計應用 > 基于uITRON操作系統的嵌入式GUI設計

基于uITRON操作系統的嵌入式GUI設計

作者: 時(shí)間:2006-10-09 來(lái)源:網(wǎng)絡(luò ) 收藏
隨著(zhù)系統技術(shù)的不斷發(fā)展,各類(lèi)應用對人機交互界面的要求也越來(lái)越高,這就使得對圖形用戶(hù)界面的需求越來(lái)越迫切。與一般系統上的圖形用戶(hù)界面相比,嵌入式系統圖形用戶(hù)界面要求輕型、占用資源少、高性能、高可靠性、可配置等特點(diǎn)。

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

1 與內核的接口

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

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

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

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

按此在新窗口瀏覽圖片
圖1 ASIX OS的總體架構

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

2 窗口管理

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

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

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

typedef struct window_class
{ U8wndclass_id; //窗口類(lèi)的ID號
// CreateWindow() 調用本函數執行控件的具體創(chuàng )建
STATUS (*create)(char *caption, U32 style, U16 x, U16 y, U16 width, U16 hight, U32 wndid, U32 menu, void **ctrl_str, void *exdata);
// DestroyWindow() 調用本函數執行控件的具體刪除
STATUS (*destroy)(void *ctrl_str);
// DefWindowProc() 調用本函數進(jìn)行消息處理
STATUS (*msg_proc)( U32 win_id, U16 asix_msg, U32 lparam,void *data, U16 wparam, void *reserved);
//GetMessage() 調用本函數進(jìn)行底層消息的翻譯與轉換
STATUS (*msg_trans)(void *ctrl_str, U16 msg_type, U32 areaId,P_U16 data, U32 size, PMSG trans_msg);
//RePaintWindow() 調用本函數重繪本窗口類(lèi)控件
STATUS (*repaint)(void *ctrl_str, U32 lparam);
//SetWindowText() 調用本函數設置本窗口類(lèi)控件的標題
STATUS (*caption)(void *ctrl_str, char *caption, void *exdata);
} WNDCLASS;

按此在新窗口瀏覽圖片
圖2 任務(wù)鏈表與窗口鏈表

  圖2所示是系統中窗口鏈表的結構,系統還維護了一張任務(wù)鏈表,每個(gè)任務(wù)控制塊(TCB)中都保留了指向本任務(wù)窗口鏈表的首指針。

3 消息傳遞與處理

  每個(gè)窗口(Form)都擁有自己的消息處理函數,該函數接收來(lái)自系統(包括窗口和控件)的消息并作相應的處理和動(dòng)作。每一個(gè)窗口處理函數實(shí)際上就是一個(gè)消息循環(huán),窗口函數通過(guò)取消息函數ASIXGetMessage()獲得系統任務(wù),并發(fā)送給該窗口的消息進(jìn)行處理。ASIXGetMessage ()獲得系統消息并進(jìn)行相應的處理和消息轉換(實(shí)際上是將底層所提供的硬件消息轉換成ASIX Window的消息,該函數通過(guò)調用相應窗口類(lèi)所定義的消息翻譯函數msg_trans()實(shí)現消息的轉換),然后窗口函數對消息進(jìn)行分檢并作相應的處理,這部分代碼是用戶(hù)自己定制的,實(shí)際上是用戶(hù)程序處理來(lái)自窗口和控件的消息,用來(lái)實(shí)現該應用程序的功能。窗口函數調用ASIX Windows的控件消息處理函數DefWindowProc(),該函數是一個(gè)消息過(guò)濾器及轉換器,它接管非用戶(hù)的,屬于控件自己的消息(這個(gè)消息可能來(lái)自用戶(hù)的操作)。它首先掃描由取消息函數獲得的消息,檢查其中是否有屬于 ASIX Windows控件的消息。如果該消息屬于某個(gè)控件,則消息處理函數調用系統窗口鏈表中該控件所對應的窗口類(lèi)所指明的消息處理函數,處理這個(gè)消息執行相應的動(dòng)作并可能發(fā)出相應的消息(例如,當用戶(hù)點(diǎn)擊某按鈕時(shí),控件消息處理函數將接管該點(diǎn)擊事件,并執行按鈕被點(diǎn)擊的動(dòng)畫(huà),同時(shí)發(fā)送一條該按鈕被點(diǎn)擊的消息)。

4 圖形接口

  ASIX Window的圖形接口設計引入了硬件抽象層的概念,圖形函數(Graphic API)不直接操縱硬件,而是通過(guò)調用硬件抽象層提供的一組基本函數來(lái)作具體的圖形繪制工作。硬件抽象層函數將按照設備相關(guān)的格式將要顯示的內容首先填寫(xiě)到系統內存的一片緩沖區(VRAM)中, 然后硬件抽象層的函數將根據傳入的參數決定是否將數據復制到LCD控制器。如果所調用函數的應用任務(wù)當前擁有LCD(前臺任務(wù)),則將數據送往LCD控制器,否則該函數僅僅將數據寫(xiě)入VRAM緩沖區(該任務(wù)是后臺任務(wù))。硬件抽象層還提供了一個(gè)叫做Refresh的函數,該函數將把當前VRAM中的內容復制到 LCD控制器的數據寄存器中。系統任務(wù)在應用任務(wù)切換的時(shí)候調用Refresh 函數,將切換進(jìn)來(lái)的任務(wù)中所屬VRAM的數據刷新到LCD中去,實(shí)現屏幕的切換,如圖3所示。

按此在新窗口瀏覽圖片
圖3 ASIX Window的圖形上下文

  為了避免圖形函數重入時(shí)帶來(lái)的問(wèn)題,以及不同應用任務(wù)擁有不同屏幕以及相應屬性的問(wèn)題,在新的設計中采用了圖形上下文(Graphic Context,簡(jiǎn)稱(chēng)GC)的結構。每個(gè)需要用到屏幕的應用任務(wù)都擁有自己的圖形上下文,該結構中保存與硬件無(wú)關(guān)的顯示屬性,比如當前色、背景色、當前線(xiàn)寬、當前填充模式、光標的位置、閃爍頻率、光標大小、顯示緩沖區(VRAM)的頭指針、物理屏幕在邏輯屏幕中的位置坐標等信息。

  實(shí)際上,這樣的設計一方面可以實(shí)現邏輯屏幕的概念,即應用程序可以在比實(shí)際物理屏幕大的屏幕上繪制圖形;另一方面,不管應用任務(wù)在前臺(擁有 LCD)還是在后臺(不擁有LCD),都可以進(jìn)行圖形函數的調用。如果是前臺任務(wù),繪制的圖形會(huì )立刻顯示在LCD上;如果是后臺任務(wù),圖形被暫時(shí)“繪制” 到該任務(wù)的VRAM中,等下次該后臺任務(wù)切換到前臺時(shí),系統任務(wù)(System Task)將調用Refresh 函數將該任務(wù)的VRAM刷新到LCD上。

結語(yǔ)

  根據以上內容,設計完成了ASIX Window 的原型系統,并在PDA應用中采用了該。為了方便應用程序員的開(kāi)發(fā),還在此基礎上設計了基于MS VC++的模擬器。圖4所示是ASIX Window在PDA系統和模擬器上的應用。ASIX Window編譯后的核心非常小巧,長(cháng)度只有200 KB左右。在可移植性方面,該GUI已成功地移植到了68000、X86、ARM等處理器平臺上。

按此在新窗口瀏覽圖片
圖4 ASIX Window在PDA上的應用以及模擬器截圖

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>