《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 設(shè)計應(yīng)用 > 基于Nios II自助點菜系統(tǒng)的μC/GUI應(yīng)用
基于Nios II自助點菜系統(tǒng)的μC/GUI應(yīng)用
來源:電子技術(shù)應(yīng)用2011年第9期
何 偉,游 婧,張 玲
(重慶大學(xué) 通信工程學(xué)院,重慶400030)
摘要: 結(jié)合自助點菜系統(tǒng),介紹了移植μC/GUI圖形庫到軟核Nios II平臺的方法,研究了μC/GUI與輸入外設(shè)的接口原理,實現(xiàn)觸摸屏操作。采用消息響應(yīng)機制,實現(xiàn)窗口、控件和對話框的觸摸應(yīng)用,并深入分析了μC/GUI基于嵌入式操作系統(tǒng)μC/OS II的工作方式,將設(shè)計劃分為多個任務(wù)操作運行,在觸摸屏上完成JPEG圖片顯示、文字介紹、菜單瀏覽等功能。
關(guān)鍵詞: SoPC NiosII 移植 μCGUI 觸摸屏
中圖分類號: TP311.5
文獻(xiàn)標(biāo)識碼: A
文章編號: 0258-7998(2011)09-0035-04
Application of μC/GUI in self-service order system based on Nios II
He Wei,You Jing,Zhang Ling
College of Communication Engineering,Chongqing University, Chongqing 400030,China
Abstract: With self-service order system, this thesis introduces how to port μC/GUI to Nios II system, and realizes the operation of touch screen based on the research about the interface between GUI and input devices. In general, all the touch screen operation about WM, control and dialog has been realized with the message callback method, and after analyzing the principle that how μC/GUI works in μC/OS II, system divides into the multitasking mode. At last, this system finishes a few functions such as displaying pictures of JPEG format, word description of every dishes, browsing menu and so on.
Key words : porting;μC/GUI;touch screen;control;μC/OS II


 隨著嵌入式系統(tǒng)在各領(lǐng)域的廣泛應(yīng)用,對圖形化人機交互界面的需求逐漸增加。由于嵌入式系統(tǒng)硬件資源有限,從而要求圖形用戶界面具有輕型、占用資源少、高性能等特點。μC/GUI是一種用于嵌入式應(yīng)用的Windows風(fēng)格圖形支持軟件,它為任何使用圖形LCD的應(yīng)用提供一個有效的不依賴于處理器和LCD控制器的圖形用戶接口,工作在單任務(wù)或多任務(wù)系統(tǒng)環(huán)境下,適用于使用任何LCD控制和任何CPU尺寸的物理或虛擬顯示。因此,掌握μC/GUI在嵌入式系統(tǒng)中的應(yīng)用極為重要。移植μC/GUI到Nios II嵌入式軟核處理器[1]成了最佳選擇。本文根據(jù)自助點菜系統(tǒng)的實際應(yīng)用,詳細(xì)介紹了μC/GUI移植方法,并在融合觸摸屏操作的基礎(chǔ)上實現(xiàn)控件使用和操作系統(tǒng)開發(fā)。
1 硬件
    系統(tǒng)中顧客使用終端觸摸屏瀏覽服務(wù)信息并實現(xiàn)相關(guān)操作,通過無線局域網(wǎng)絡(luò)和前臺通信。各個點菜終端作為獨立系統(tǒng)工作,所有數(shù)據(jù)傳到前臺上位機協(xié)調(diào)處理。本文僅介紹與μC/GUI相關(guān)的點菜終端構(gòu)成部分。終端硬件框圖如圖1所示,利用片上可編程系統(tǒng)(SoPC)技術(shù)將Nios II處理器、外設(shè)接口控制器等功能模塊集成到FPGA,構(gòu)成可編程片上系統(tǒng)[2]。SDRAM、Flash控制器用于處理程序和數(shù)據(jù)的存儲;512 KB SRAM作為圖像數(shù)據(jù)緩存區(qū);FPGA內(nèi)部自定義LTM控制器和SD卡控制器模塊,輔助軟核工作,操作觸摸屏并讀取SD卡內(nèi)的JPEG圖片;UART接口用于和移植到CC2430的ZigBee模塊通信;采用定時器以嵌入?滋C/OS II操作系統(tǒng)。

    觸摸顯示屏是4.3英寸數(shù)字LCD觸碰面板TRDB-LTM,長寬比為15:9,支持24 bit并行RGB接口,能通過內(nèi)置模數(shù)轉(zhuǎn)換器(AD7843)將觸碰點X/Y坐標(biāo)轉(zhuǎn)換成對應(yīng)數(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內(nèi)核文件、與字體相關(guān)的代碼文件、LCD驅(qū)動代碼文件、μC/GUI支持的控件代碼以及視窗管理部分代碼等[3]。

 


2.1 修改LCD配置文件
    為使系統(tǒng)正確工作,必須修改文件LCDConf.h(GUI目錄中)中的一些配置宏。該文件與硬件直接相關(guān),根據(jù)所使用的LCD類型和LCD控制器進(jìn)行配置。由于μC/GUI提供不同型號的LCD配置文件(文件夾Sample\LCDConf\xxx中,xxx代表LCD驅(qū)動器名稱),應(yīng)用程序開發(fā)者可直接在此基礎(chǔ)上修改程序。實際應(yīng)用中,選擇LCDLin.c驅(qū)動文件。由于LTM控制器對顯示分辨率進(jìn)行硬擴處理,因此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àn)對圖像數(shù)據(jù)緩存區(qū)的16 bit讀寫操作。此外,一般移植操作必須定義LCD_INIT_CONTROLLER(),以實現(xiàn)LCD屏初始化配置。LTM控制器初始化了觸摸屏,因此軟件配置中省略此項。
2.2 修改GUI和觸摸屏配置文件
    在調(diào)整系統(tǒng)或減小內(nèi)存消耗時需配置LCDConf.h。具體步驟如下:(1)備份原始配置文件;(2)檢查所有配置開關(guān);(3)刪除配置中不使用部分。除此之外,系統(tǒng)工程編譯時,會出現(xiàn)一些未定義錯誤,需要將Sample\GUI_X\GUI_X.c添加到工程中,該文件定義GUI與操作系統(tǒng)的接口,以及Debug錯誤報告等函數(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);}
同時將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支持鍵盤、鼠標(biāo)、觸摸屏等外設(shè),并在源碼級對其消息響應(yīng)。為使觸摸屏正常工作,系統(tǒng)除對相應(yīng)配置文件修改和添加一些相關(guān)函數(shù)外,必須實現(xiàn)觸摸屏底層驅(qū)動,即修改LCDLin.c驅(qū)動文件。
    理論上,GUI_TOUCH_AD_LEFT和GUI_TOUCH_AD_RIGHT取值應(yīng)當(dāng)為0或1 024,但實際操作時,必須根據(jù)具體情況校準(zhǔn)。系統(tǒng)取觸摸屏四個角坐標(biāo)作為校正標(biāo)準(zhǔn),經(jīng)過多次試驗,四個坐標(biāo)分別是(29,160)、(3 936,160)、(29,3 900)和(3 936,3 900)。在GUI\Core\GUI_TOUCH_DriverAnalog.c中修改相應(yīng)宏,再據(jù)實際情形確定余下開關(guān)宏的值。
    通過調(diào)用GUI_TOUCH_Exec()函數(shù)來獲得觸摸屏觸點位置:系統(tǒng)通過中斷服務(wù)程序讀回觸點實際坐標(biāo)值(x,y);接著將實際坐標(biāo)值轉(zhuǎn)換到邏輯坐標(biāo);最后調(diào)用GUI_TOUCH_StoreState(x,y)保存邏輯坐標(biāo)值。為實時得到觸點坐標(biāo),需不斷調(diào)用GUI_TOUCH_Exec()函數(shù),因此建立單獨任務(wù)對該函數(shù)調(diào)用,以保證觸摸屏任務(wù)的實時響應(yīng)。該部分設(shè)計難點在于中斷標(biāo)志清零,如果每次得到觸點位置后不能即刻清零,則會影響GUI內(nèi)部去抖操作和校準(zhǔn)處理,因此在保存穩(wěn)定坐標(biāo)值后再清除標(biāo)志位。
3 μC/GUI應(yīng)用開發(fā)
3.1 觸摸屏消息響應(yīng)機制

    GUI所有外設(shè)輸入均以消息形式發(fā)送給當(dāng)前窗體回調(diào)函數(shù)處理,具體流程如圖2所示[5]。觸摸屏的消息傳遞實質(zhì)是對全局變量_State記載和更新。_State有3個成員變量:消息發(fā)生點x坐標(biāo)、y坐標(biāo)、外設(shè)按下與否的操作狀態(tài)。外設(shè)輸入消息統(tǒng)稱為WM_TOUCH,函數(shù)WM_HandlePID()專門處理這種消息。通過GUI_PID_GetState獲取GUI_PID_STATE結(jié)構(gòu)的WM_TOUCH消息,將新獲取消息與函數(shù)內(nèi)靜態(tài)舊消息變量比較,包括該消息發(fā)生點的屏幕坐標(biāo)及外設(shè)操作狀態(tài)。狀態(tài)發(fā)生變化是將操作狀態(tài)變化作為獨立消息WM_PID_STATE_CHANGED發(fā)送,再發(fā)送WM_TOUCH消息。構(gòu)造WM_TOUCH消息所用到的數(shù)據(jù),需要獲取當(dāng)前焦點窗體句柄,當(dāng)前焦點窗體是用WM_hCapture全局變量記載,如果為0則調(diào)用函數(shù)WM_Screen2hWin(),根據(jù)消息發(fā)生點屏幕坐標(biāo)獲取窗體句柄。向當(dāng)前焦點窗體發(fā)送消息后,更新當(dāng)前消息到舊消息變量,結(jié)束本次消息處理。


3.2 窗口、控件和對話框應(yīng)用
    系統(tǒng)界面豐富,頻繁用到頁面切換,因此使用?滋C/GUI視窗管理器(WM)進(jìn)行窗口創(chuàng)建、顯示、隱藏和刪除等。用戶程序中對不同窗口指定不同回調(diào)函數(shù),當(dāng)指定事件發(fā)生時,通知圖形系統(tǒng)調(diào)用指定函數(shù),如窗口內(nèi)容改變時自動重繪的場合等。圖3(a)、圖3(b)分別為菜品推薦及菜單顯示窗口。
    為使點菜系統(tǒng)功能更加豐富,界面中加入按鈕、列表框、單選按鈕、框架窗口等控件。控件是構(gòu)造用戶接口的元素,能自動對某些事件反應(yīng)。控件也是通過其構(gòu)造函數(shù)返回的句柄而引用??丶褂靡暣肮芾砥?,一旦一個控件建立,它被處理成與其他窗口一樣,WM保證它在需要時能正確顯示(及重繪)。

    控件消息響應(yīng)機制在使用中十分重要,包括按鈕觸碰響應(yīng)、單選按鈕序列號獲取、列表框滑動等。下面以按鈕為例介紹其功能。Button按鈕在其回調(diào)函數(shù)中對相關(guān)消息(WM_MOUSEOVER/WM_PID_STATE_CHANGED/WM_TOUCH)進(jìn)行處理,在button.c文件中可找到相關(guān)實現(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ù)消息被對話框自動處理,其他傳送給對話框指定的回調(diào)函數(shù)。其中,將WM_INIT_DIALOG和WM_NOTIFY_PARENT兩種類型的附加消息傳送到對話框窗口進(jìn)行處理。對話框顯示前,WM_INIT_DIALOG消息立即被發(fā)送到對話框處理,對話框程序用這個消息初始化控件以及實現(xiàn)其他影響對話框顯示的初始化任務(wù);通過對話框的子窗口發(fā)送WM_NOTIFY_PARENT消息到對話框,通知父窗口以保證事件同步。
3.3μC/OS II應(yīng)用
    系統(tǒng)使用接口函數(shù)OSTaskCreateExt 創(chuàng)建任務(wù),根據(jù)系統(tǒng)要求,設(shè)計四個任務(wù),分別是:初始化任務(wù)(TaskStart)、接收消息任務(wù)(TaskRxmsg)、響應(yīng)觸摸任務(wù)(TaskTouch)和更新任務(wù)(TaskUpdate)。任務(wù)間通過信號量、全局變量等方式通信,具體狀態(tài)轉(zhuǎn)移如圖4所示。

    (1)初始化任務(wù)
    優(yōu)先級別最高,用于建立和調(diào)用系統(tǒng)初始化函數(shù)。系統(tǒng)上電后,首先對各個硬件模塊、軟件內(nèi)各數(shù)據(jù)初始化,如果SD卡讀取不成功、無線運行不正常,LED燈提示系統(tǒng)初始化失敗,同時系統(tǒng)退出運行狀態(tài)。反之,初始化完畢,系統(tǒng)開始任務(wù)調(diào)度。
    (2)接收消息任務(wù)
    接收上位機傳回的確認(rèn)信息,實時顯示菜單狀態(tài):準(zhǔn)備中、制作中、傳送中和已上菜。由于無線發(fā)回數(shù)據(jù)不定時,且為了避免數(shù)據(jù)丟失,該任務(wù)優(yōu)先級別高于TaskTouch。該任務(wù)與TaskTouch之間用信號量通信。
    (3)響應(yīng)觸摸任務(wù)
    用于執(zhí)行GUI_TOUCH_Exec()函數(shù),更新觸摸點狀態(tài),設(shè)置窗口、對話框等的回調(diào)函數(shù),進(jìn)行界面切換。放棄對CPU占用后,系統(tǒng)調(diào)度將CPU占用權(quán)交給TaskUpdate。
    (4)更新任務(wù)
    由于使用視窗管理回調(diào)機制,該任務(wù)必須實現(xiàn),并定期調(diào)用(至少每秒鐘100次),優(yōu)先級別最低。僅從一個任務(wù)調(diào)用GUI更新函數(shù)(即GUI_Exec(),GUI_Delay()),有助于保持程序結(jié)構(gòu)清晰。任務(wù)完成后,按任務(wù)優(yōu)先級高低開始新一輪調(diào)度。
    以μC/OS-II操作系統(tǒng)為基礎(chǔ),系統(tǒng)在響應(yīng)觸摸任務(wù)和更新任務(wù)中分別調(diào)用μC/GUI函數(shù)。該項工作通過在配置中使能多任務(wù)支持及配合內(nèi)核接口函數(shù)來完成。由于任務(wù)實時行為只受運行在更高級別任務(wù)的影響,所以在低級別任務(wù)中設(shè)置用戶界面,使其切換到用戶界面時不會影響實時行為。
    本文介紹的系統(tǒng),在Nios II架構(gòu)上移植了可視化圖形庫μC/GUI,系統(tǒng)重點研究了如何應(yīng)用?滋C/GUI。在實現(xiàn)觸摸屏操作的基礎(chǔ)上,結(jié)合消息響應(yīng)機制實現(xiàn)窗口、控件和對話框的使用,并融合多任務(wù)操作系統(tǒng)提高點菜的實時性。LTM觸摸屏顯示帶有Windows風(fēng)格圖形界面,顧客可根據(jù)菜品圖片、營養(yǎng)介紹及價格隨時點餐。通過GUI整合的觸摸操作,實現(xià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è)計原理及應(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開發(fā)圖形用戶界面[J].計算機工程與設(shè)計,2005,26(1):253-255.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。