文獻標識碼: A
文章編號: 0258-7998(2011)09-0035-04
隨著嵌入式系統(tǒng)在各領域的廣泛應用,,對圖形化人機交互界面的需求逐漸增加,。由于嵌入式系統(tǒng)硬件資源有限,從而要求圖形用戶界面具有輕型,、占用資源少,、高性能等特點。μC/GUI是一種用于嵌入式應用的Windows風格圖形支持軟件,,它為任何使用圖形LCD的應用提供一個有效的不依賴于處理器和LCD控制器的圖形用戶接口,,工作在單任務或多任務系統(tǒng)環(huán)境下,適用于使用任何LCD控制和任何CPU尺寸的物理或虛擬顯示,。因此,,掌握μC/GUI在嵌入式系統(tǒng)中的應用極為重要。移植μC/GUI到Nios II嵌入式軟核處理器[1]成了最佳選擇,。本文根據(jù)自助點菜系統(tǒng)的實際應用,,詳細介紹了μC/GUI移植方法,并在融合觸摸屏操作的基礎上實現(xiàn)控件使用和操作系統(tǒng)開發(fā),。
1 硬件
系統(tǒng)中顧客使用終端觸摸屏瀏覽服務信息并實現(xiàn)相關操作,,通過無線局域網絡和前臺通信。各個點菜終端作為獨立系統(tǒng)工作,,所有數(shù)據(jù)傳到前臺上位機協(xié)調處理,。本文僅介紹與μC/GUI相關的點菜終端構成部分。終端硬件框圖如圖1所示,,利用片上可編程系統(tǒng)(SoPC)技術將Nios II處理器,、外設接口控制器等功能模塊集成到FPGA,構成可編程片上系統(tǒng)[2],。SDRAM,、Flash控制器用于處理程序和數(shù)據(jù)的存儲,;512 KB SRAM作為圖像數(shù)據(jù)緩存區(qū);FPGA內部自定義LTM控制器和SD卡控制器模塊,,輔助軟核工作,操作觸摸屏并讀取SD卡內的JPEG圖片,;UART接口用于和移植到CC2430的ZigBee模塊通信,;采用定時器以嵌入?滋C/OS II操作系統(tǒng)。
觸摸顯示屏是4.3英寸數(shù)字LCD觸碰面板TRDB-LTM,,長寬比為15:9,,支持24 bit并行RGB接口,能通過內置模數(shù)轉換器(AD7843)將觸碰點X/Y坐標轉換成對應數(shù)字信息,。觸摸屏物理分辨率為800×480,,支持16 bit RGB565格式。
2 μC/GUI移植
本系統(tǒng)的用戶界面采用?滋C/GUI,,其最新版本是3.98,,其中一些組件不太完整。根據(jù)點菜系統(tǒng)使用需求,,特添加3.94版本的JPEG模塊來顯示圖片數(shù)據(jù),。ucgui398\Start\Config和ucgui398\Start\GUI是源碼包最重要的兩個文件夾,其中包括各種配置文件,、μC/GUI內核文件,、與字體相關的代碼文件、LCD驅動代碼文件,、μC/GUI支持的控件代碼以及視窗管理部分代碼等[3],。
2.1 修改LCD配置文件
為使系統(tǒng)正確工作,必須修改文件LCDConf.h(GUI目錄中)中的一些配置宏,。該文件與硬件直接相關,,根據(jù)所使用的LCD類型和LCD控制器進行配置。由于μC/GUI提供不同型號的LCD配置文件(文件夾Sample\LCDConf\xxx中,,xxx代表LCD驅動器名稱),,應用程序開發(fā)者可直接在此基礎上修改程序。實際應用中,,選擇LCDLin.c驅動文件,。由于LTM控制器對顯示分辨率進行硬擴處理,因此LCD尺寸選擇400×240,。系統(tǒng)底層配置的部分宏如表1所示,。
LCD_READ_MEM(off)、LCD_WRITE_MEM(off,,data)宏定義是μC/GUI與LTM控制器接口的關鍵[4],。SRAM_BASE是512 KB SRAM讀寫操作的基地址,,這些宏定義能實現(xiàn)對圖像數(shù)據(jù)緩存區(qū)的16 bit讀寫操作。此外,,一般移植操作必須定義LCD_INIT_CONTROLLER(),,以實現(xiàn)LCD屏初始化配置。LTM控制器初始化了觸摸屏,,因此軟件配置中省略此項,。
2.2 修改GUI和觸摸屏配置文件
在調整系統(tǒng)或減小內存消耗時需配置LCDConf.h。具體步驟如下:(1)備份原始配置文件,;(2)檢查所有配置開關,;(3)刪除配置中不使用部分。除此之外,,系統(tǒng)工程編譯時,,會出現(xiàn)一些未定義錯誤,需要將Sample\GUI_X\GUI_X.c添加到工程中,,該文件定義GUI與操作系統(tǒng)的接口,,以及Debug錯誤報告等函數(shù)。由于系統(tǒng)使用μ/OS II,,可選擇GUI_X_uCOS.c文件,,并在文件結尾處添加以下函數(shù):
void GUI_X_Log(const char *s){GUI_USE_PARA(s);}
void GUI_X_Warn(const char *s){GUI_USE_PARA(s);}
void GUI_X_ErrorOut(const char *s){GUI_USE_PARA(s);}
同時將GUI_X_ExecIdle( )中的OS_X_Delay(1)替換為OSTimeDly(1)。
GUI文件夾中另一個需要配置的文件是GUITouchConf.h,,根據(jù)觸摸屏類型不同,,宏參數(shù)也不同。執(zhí)行觸摸屏操作的主要流程在GUI\Core\GUI_TOUCH_DriverAnalog.c文件中,。頭文件部分宏配置如表2所示,。
2.3 觸摸屏與GUI接口
μC/GUI支持鍵盤、鼠標,、觸摸屏等外設,,并在源碼級對其消息響應。為使觸摸屏正常工作,,系統(tǒng)除對相應配置文件修改和添加一些相關函數(shù)外,,必須實現(xiàn)觸摸屏底層驅動,即修改LCDLin.c驅動文件,。
理論上,,GUI_TOUCH_AD_LEFT和GUI_TOUCH_AD_RIGHT取值應當為0或1 024,但實際操作時,,必須根據(jù)具體情況校準,。系統(tǒng)取觸摸屏四個角坐標作為校正標準,經過多次試驗,,四個坐標分別是(29,,160),、(3 936,160),、(29,,3 900)和(3 936,3 900),。在GUI\Core\GUI_TOUCH_DriverAnalog.c中修改相應宏,,再據(jù)實際情形確定余下開關宏的值。
通過調用GUI_TOUCH_Exec()函數(shù)來獲得觸摸屏觸點位置:系統(tǒng)通過中斷服務程序讀回觸點實際坐標值(x,,y);接著將實際坐標值轉換到邏輯坐標,;最后調用GUI_TOUCH_StoreState(x,,y)保存邏輯坐標值。為實時得到觸點坐標,,需不斷調用GUI_TOUCH_Exec()函數(shù),,因此建立單獨任務對該函數(shù)調用,以保證觸摸屏任務的實時響應,。該部分設計難點在于中斷標志清零,,如果每次得到觸點位置后不能即刻清零,則會影響GUI內部去抖操作和校準處理,,因此在保存穩(wěn)定坐標值后再清除標志位,。
3 μC/GUI應用開發(fā)
3.1 觸摸屏消息響應機制
GUI所有外設輸入均以消息形式發(fā)送給當前窗體回調函數(shù)處理,具體流程如圖2所示[5],。觸摸屏的消息傳遞實質是對全局變量_State記載和更新,。_State有3個成員變量:消息發(fā)生點x坐標、y坐標,、外設按下與否的操作狀態(tài),。外設輸入消息統(tǒng)稱為WM_TOUCH,函數(shù)WM_HandlePID()專門處理這種消息,。通過GUI_PID_GetState獲取GUI_PID_STATE結構的WM_TOUCH消息,,將新獲取消息與函數(shù)內靜態(tài)舊消息變量比較,包括該消息發(fā)生點的屏幕坐標及外設操作狀態(tài),。狀態(tài)發(fā)生變化是將操作狀態(tài)變化作為獨立消息WM_PID_STATE_CHANGED發(fā)送,,再發(fā)送WM_TOUCH消息。構造WM_TOUCH消息所用到的數(shù)據(jù),,需要獲取當前焦點窗體句柄,,當前焦點窗體是用WM_hCapture全局變量記載,如果為0則調用函數(shù)WM_Screen2hWin(),,根據(jù)消息發(fā)生點屏幕坐標獲取窗體句柄,。向當前焦點窗體發(fā)送消息后,,更新當前消息到舊消息變量,結束本次消息處理,。
3.2 窗口,、控件和對話框應用
系統(tǒng)界面豐富,頻繁用到頁面切換,,因此使用?滋C/GUI視窗管理器(WM)進行窗口創(chuàng)建,、顯示、隱藏和刪除等,。用戶程序中對不同窗口指定不同回調函數(shù),,當指定事件發(fā)生時,通知圖形系統(tǒng)調用指定函數(shù),,如窗口內容改變時自動重繪的場合等,。圖3(a)、圖3(b)分別為菜品推薦及菜單顯示窗口,。
為使點菜系統(tǒng)功能更加豐富,,界面中加入按鈕、列表框,、單選按鈕,、框架窗口等控件??丶菢嬙煊脩艚涌诘脑?,能自動對某些事件反應??丶彩峭ㄟ^其構造函數(shù)返回的句柄而引用,。控件使用視窗管理器,,一旦一個控件建立,,它被處理成與其他窗口一樣,WM保證它在需要時能正確顯示(及重繪),。
控件消息響應機制在使用中十分重要,,包括按鈕觸碰響應、單選按鈕序列號獲取,、列表框滑動等,。下面以按鈕為例介紹其功能。Button按鈕在其回調函數(shù)中對相關消息(WM_MOUSEOVER/WM_PID_STATE_CHANGED/WM_TOUCH)進行處理,,在button.c文件中可找到相關實現(xiàn)函數(shù),,用觸摸屏點擊該按鈕時發(fā)送以下三種消息之一:WM_NOTIFICATION_MOVED_OUT、WM_NOTIFICATION_RELEASED、WM_NOTIFICATION_PRESSED,,之后在該按鈕父窗口捕獲并處理消息,。系統(tǒng)是通過捕獲WM_NOTIFICATION_RELEASED消息實現(xiàn)按鈕觸碰功能的。
系統(tǒng)除了點菜外,,還能存儲會員信息,,用于累積會員積分,如圖3(c),。對于新建和登錄賬戶界面,,使用對話框是很需要的。建立對話框需要做兩件基本工作:一個資源表,,定義包括的控件,;另一個是定義控件的初始化。對話框包含多個控件(框架窗口,、按鈕,、編輯框、文本框),,通過對不同控件的選擇向系統(tǒng)發(fā)出請求信息,。多數(shù)消息被對話框自動處理,,其他傳送給對話框指定的回調函數(shù),。其中,將WM_INIT_DIALOG和WM_NOTIFY_PARENT兩種類型的附加消息傳送到對話框窗口進行處理,。對話框顯示前,,WM_INIT_DIALOG消息立即被發(fā)送到對話框處理,對話框程序用這個消息初始化控件以及實現(xiàn)其他影響對話框顯示的初始化任務,;通過對話框的子窗口發(fā)送WM_NOTIFY_PARENT消息到對話框,,通知父窗口以保證事件同步。
3.3μC/OS II應用
系統(tǒng)使用接口函數(shù)OSTaskCreateExt 創(chuàng)建任務,,根據(jù)系統(tǒng)要求,,設計四個任務,分別是:初始化任務(TaskStart),、接收消息任務(TaskRxmsg),、響應觸摸任務(TaskTouch)和更新任務(TaskUpdate)。任務間通過信號量,、全局變量等方式通信,,具體狀態(tài)轉移如圖4所示。
(1)初始化任務
優(yōu)先級別最高,,用于建立和調用系統(tǒng)初始化函數(shù),。系統(tǒng)上電后,首先對各個硬件模塊、軟件內各數(shù)據(jù)初始化,,如果SD卡讀取不成功,、無線運行不正常,LED燈提示系統(tǒng)初始化失敗,,同時系統(tǒng)退出運行狀態(tài),。反之,初始化完畢,,系統(tǒng)開始任務調度,。
(2)接收消息任務
接收上位機傳回的確認信息,實時顯示菜單狀態(tài):準備中,、制作中,、傳送中和已上菜。由于無線發(fā)回數(shù)據(jù)不定時,,且為了避免數(shù)據(jù)丟失,,該任務優(yōu)先級別高于TaskTouch。該任務與TaskTouch之間用信號量通信,。
(3)響應觸摸任務
用于執(zhí)行GUI_TOUCH_Exec()函數(shù),,更新觸摸點狀態(tài),設置窗口,、對話框等的回調函數(shù),,進行界面切換。放棄對CPU占用后,,系統(tǒng)調度將CPU占用權交給TaskUpdate,。
(4)更新任務
由于使用視窗管理回調機制,該任務必須實現(xiàn),,并定期調用(至少每秒鐘100次),,優(yōu)先級別最低。僅從一個任務調用GUI更新函數(shù)(即GUI_Exec(),,GUI_Delay()),,有助于保持程序結構清晰。任務完成后,,按任務優(yōu)先級高低開始新一輪調度,。
以μC/OS-II操作系統(tǒng)為基礎,系統(tǒng)在響應觸摸任務和更新任務中分別調用μC/GUI函數(shù),。該項工作通過在配置中使能多任務支持及配合內核接口函數(shù)來完成,。由于任務實時行為只受運行在更高級別任務的影響,所以在低級別任務中設置用戶界面,,使其切換到用戶界面時不會影響實時行為,。
本文介紹的系統(tǒng),在Nios II架構上移植了可視化圖形庫μC/GUI,系統(tǒng)重點研究了如何應用?滋C/GUI,。在實現(xiàn)觸摸屏操作的基礎上,,結合消息響應機制實現(xiàn)窗口、控件和對話框的使用,,并融合多任務操作系統(tǒng)提高點菜的實時性,。LTM觸摸屏顯示帶有Windows風格圖形界面,顧客可根據(jù)菜品圖片,、營養(yǎng)介紹及價格隨時點餐,。通過GUI整合的觸摸操作,實現(xiàn)了自助點菜,、查看菜品狀態(tài),、加菜、退菜以及結賬功能,,可提供更優(yōu)質,、更人性化的服務。
參考文獻
[1] Altera Corporation.Nios II processor reference handbook[M]. 2005.
[2] 李蘭英.Nios II嵌入式軟核SOPC設計原理及應用[M].北京:北京航空航天大學出版社,,2006.
[3] Micrium Inc.μC/GUI manual Rev.0[M].2002.
[4] Qiu Chuanfei,,Zhang Wei,Zhou Quanzhi,,et al.Porting μC/GUI To LCD and VGA in Nios II system[C].International Conference on Measuring Technology and Mechatronics Automation,,Changsha,2010.
[5] 葛欣,,孟凡榮.使用μC/GUI開發(fā)圖形用戶界面[J].計算機工程與設計,,2005,,26(1):253-255.