《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 設(shè)計(jì)應(yīng)用 > 基于Nios II自助點(diǎn)菜系統(tǒng)的μC/GUI應(yīng)用
基于Nios II自助點(diǎn)菜系統(tǒng)的μC/GUI應(yīng)用
來源:電子技術(shù)應(yīng)用2011年第9期
何 偉,游 婧,張 玲
(重慶大學(xué) 通信工程學(xué)院,重慶400030)
摘要: 結(jié)合自助點(diǎn)菜系統(tǒng),介紹了移植μC/GUI圖形庫到軟核Nios II平臺(tái)的方法,研究了μC/GUI與輸入外設(shè)的接口原理,實(shí)現(xiàn)觸摸屏操作。采用消息響應(yīng)機(jī)制,實(shí)現(xiàn)窗口、控件和對(duì)話框的觸摸應(yīng)用,并深入分析了μC/GUI基于嵌入式操作系統(tǒng)μC/OS II的工作方式,將設(shè)計(jì)劃分為多個(gè)任務(wù)操作運(yùn)行,在觸摸屏上完成JPEG圖片顯示、文字介紹、菜單瀏覽等功能。
關(guān)鍵詞: SoPC NiosII 移植 μCGUI 觸摸屏
中圖分類號(hào): TP311.5
文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 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)用,對(duì)圖形化人機(jī)交互界面的需求逐漸增加。由于嵌入式系統(tǒng)硬件資源有限,從而要求圖形用戶界面具有輕型、占用資源少、高性能等特點(diǎn)。μC/GUI是一種用于嵌入式應(yīng)用的Windows風(fēng)格圖形支持軟件,它為任何使用圖形LCD的應(yīng)用提供一個(gè)有效的不依賴于處理器和LCD控制器的圖形用戶接口,工作在單任務(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)開發(fā)。
1 硬件
    系統(tǒng)中顧客使用終端觸摸屏瀏覽服務(wù)信息并實(shí)現(xiàn)相關(guān)操作,通過無線局域網(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接口,能通過內(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)的用戶界面采用?滋C/GUI,其最新版本是3.98,其中一些組件不太完整。根據(jù)點(diǎn)菜系統(tǒng)使用需求,特添加3.94版本的JPEG模塊來顯示圖片數(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類型和LCD控制器進(jìn)行配置。由于μC/GUI提供不同型號(hào)的LCD配置文件(文件夾Sample\LCDConf\xxx中,xxx代表LCD驅(qū)動(dòng)器名稱),應(yīng)用程序開發(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讀寫操作的基地址,這些宏定義能實(shí)現(xiàn)對(duì)圖像數(shù)據(jù)緩存區(qū)的16 bit讀寫操作。此外,一般移植操作必須定義LCD_INIT_CONTROLLER(),以實(shí)現(xiàn)LCD屏初始化配置。LTM控制器初始化了觸摸屏,因此軟件配置中省略此項(xiàng)。
2.2 修改GUI和觸摸屏配置文件
    在調(diào)整系統(tǒng)或減小內(nèi)存消耗時(shí)需配置LCDConf.h。具體步驟如下:(1)備份原始配置文件;(2)檢查所有配置開關(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ù)觸摸屏類型不同,宏參數(shù)也不同。執(zhí)行觸摸屏操作的主要流程在GUI\Core\GUI_TOUCH_DriverAnalog.c文件中。頭文件部分宏配置如表2所示。

2.3 觸摸屏與GUI接口
    μC/GUI支持鍵盤、鼠標(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)過多次試驗(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í)際情形確定余下開關(guān)宏的值。
    通過調(diào)用GUI_TOUCH_Exec()函數(shù)來獲得觸摸屏觸點(diǎn)位置:系統(tǒng)通過中斷服務(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)用開發(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)稱為WM_TOUCH,函數(shù)WM_HandlePID()專門處理這種消息。通過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)界面豐富,頻繁用到頁面切換,因此使用?滋C/GUI視窗管理器(WM)進(jìn)行窗口創(chuàng)建、顯示、隱藏和刪除等。用戶程序中對(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)造用戶接口的元素,能自動(dòng)對(duì)某些事件反應(yīng)??丶彩峭ㄟ^其構(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)是通過捕獲WM_NOTIFICATION_RELEASED消息實(shí)現(xiàn)按鈕觸碰功能的。
    系統(tǒng)除了點(diǎn)菜外,還能存儲(chǔ)會(huì)員信息,用于累積會(huì)員積分,如圖3(c)。對(duì)于新建和登錄賬戶界面,使用對(duì)話框是很需要的。建立對(duì)話框需要做兩件基本工作:一個(gè)資源表,定義包括的控件;另一個(gè)是定義控件的初始化。對(duì)話框包含多個(gè)控件(框架窗口、按鈕、編輯框、文本框),通過對(duì)不同控件的選擇向系統(tǒng)發(fā)出請(qǐng)求信息。多數(shù)消息被對(duì)話框自動(dòng)處理,其他傳送給對(duì)話框指定的回調(diào)函數(shù)。其中,將WM_INIT_DIALOG和WM_NOTIFY_PARENT兩種類型的附加消息傳送到對(duì)話框窗口進(jìn)行處理。對(duì)話框顯示前,WM_INIT_DIALOG消息立即被發(fā)送到對(duì)話框處理,對(duì)話框程序用這個(gè)消息初始化控件以及實(shí)現(xiàn)其他影響對(duì)話框顯示的初始化任務(wù);通過對(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ù)間通過信號(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卡讀取不成功、無線運(yùn)行不正常,LED燈提示系統(tǒng)初始化失敗,同時(shí)系統(tǒng)退出運(yùn)行狀態(tài)。反之,初始化完畢,系統(tǒng)開始任務(wù)調(diào)度。
    (2)接收消息任務(wù)
    接收上位機(jī)傳回的確認(rèn)信息,實(shí)時(shí)顯示菜單狀態(tài):準(zhǔn)備中、制作中、傳送中和已上菜。由于無線發(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í)高低開始新一輪調(diào)度。
    以μC/OS-II操作系統(tǒng)為基礎(chǔ),系統(tǒng)在響應(yīng)觸摸任務(wù)和更新任務(wù)中分別調(diào)用μC/GUI函數(shù)。該項(xiàng)工作通過在配置中使能多任務(wù)支持及配合內(nèi)核接口函數(shù)來完成。由于任務(wù)實(shí)時(shí)行為只受運(yùn)行在更高級(jí)別任務(wù)的影響,所以在低級(jí)別任務(wù)中設(shè)置用戶界面,使其切換到用戶界面時(shí)不會(huì)影響實(shí)時(shí)行為。
    本文介紹的系統(tǒng),在Nios II架構(gòu)上移植了可視化圖形庫μ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)介紹及價(jià)格隨時(shí)點(diǎn)餐。通過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開發(fā)圖形用戶界面[J].計(jì)算機(jī)工程與設(shè)計(jì),2005,26(1):253-255.

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