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