<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è) > 嵌入式系統 > 設計應用 > 基于Nios II自助點(diǎn)菜系統的μC/GUI應用

基于Nios II自助點(diǎn)菜系統的μC/GUI應用

作者: 時(shí)間:2017-06-05 來(lái)源:網(wǎng)絡(luò ) 收藏

隨著(zhù)嵌入式系統在各領(lǐng)域的廣泛應用,對圖形化人機交互界面的需求逐漸增加。由于嵌入式系統硬件資源有限,從而要求圖形用戶(hù)界面具有輕型、占用資源少、高性能等特點(diǎn)。μC/GUI是一種用于嵌入式應用的Windows風(fēng)格圖形支持軟件,它為任何使用圖形LCD的應用提供一個(gè)有效的不依賴(lài)于處理器和LCD控制器的圖形用戶(hù)接口,工作在單任務(wù)或多任務(wù)系統環(huán)境下,適用于使用任何LCD控制和任何CPU尺寸的物理或虛擬顯示。因此,掌握μC/GUI在嵌入式系統中的應用極為重要。移植μC/GUI到Nios II嵌入式軟核處理器[1]成了最佳選擇。本文根據自助點(diǎn)菜系統的實(shí)際應用,詳細介紹了μC/GUI移植方法,并在融合觸摸屏操作的基礎上實(shí)現控件使用和操作系統開(kāi)發(fā)。

1 硬件

系統中顧客使用終端觸摸屏瀏覽服務(wù)信息并實(shí)現相關(guān)操作,通過(guò)無(wú)線(xiàn)局域網(wǎng)絡(luò )和前臺通信。各個(gè)點(diǎn)菜終端作為獨立系統工作,所有數據傳到前臺上位機協(xié)調處理。本文僅介紹與μC/GUI相關(guān)的點(diǎn)菜終端構成部分。終端硬件框圖如圖1所示,利用片上可編程系統(SoPC)技術(shù)將Nios II處理器、外設接口控制器等功能模塊集成到FPGA,構成可編程片上系統[2]。SDRAM、Flash控制器用于處理程序和數據的存儲;512 KB SRAM作為圖像數據緩存區;FPGA內部自定義LTM控制器和SD卡控制器模塊,輔助軟核工作,操作觸摸屏并讀取SD卡內的JPEG圖片;UART接口用于和移植到CC2430的ZigBee模塊通信;采用定時(shí)器以嵌入式uC/OS II操作系統。

觸摸顯示屏是4.3英寸數字LCD觸碰面板TRDB-LTM,長(cháng)寬比為15:9,支持24 bit并行RGB接口,能通過(guò)內置模數轉換器(AD7843)將觸碰點(diǎn)X/Y坐標轉換成對應數字信息。觸摸屏物理分辨率為800×480,支持16 bit RGB565格式。

本文引用地址:http://dyxdggzs.com/article/201706/349148.htm

2 μC/GUI移植

本系統的用戶(hù)界面采用uC/GUI,其最新版本是3.98,其中一些組件不太完整。根據點(diǎn)菜系統使用需求,特添加3.94版本的JPEG模塊來(lái)顯示圖片數據。ucgui398StartConfig和ucgui398StartGUI是源碼包最重要的兩個(gè)文件夾,其中包括各種配置文件、μC/GUI內核文件、與字體相關(guān)的代碼文件、LCD驅動(dòng)代碼文件、μC/GUI支持的控件代碼以及視窗管理部分代碼等[3]。

2.1 修改LCD配置文件

為使系統正確工作,必須修改文件LCDConf.h(GUI目錄中)中的一些配置宏。該文件與硬件直接相關(guān),根據所使用的LCD類(lèi)型和LCD控制器進(jìn)行配置。由于μC/GUI提供不同型號的LCD配置文件(文件夾SampleLCDConfxxx中,xxx代表LCD驅動(dòng)器名稱(chēng)),應用程序開(kāi)發(fā)者可直接在此基礎上修改程序。實(shí)際應用中,選擇LCDLin.c驅動(dòng)文件。由于LTM控制器對顯示分辨率進(jìn)行硬擴處理,因此LCD尺寸選擇400×240。系統底層配置的部分宏如表1所示。

LCD_READ_MEM(off)、LCD_WRITE_MEM(off,data)宏定義是μC/GUI與LTM控制器接口的關(guān)鍵[4]。SRAM_BASE是512 KB SRAM讀寫(xiě)操作的基地址,這些宏定義能實(shí)現對圖像數據緩存區的16 bit讀寫(xiě)操作。此外,一般移植操作必須定義LCD_INIT_CONTROLLER(),以實(shí)現LCD屏初始化配置。LTM控制器初始化了觸摸屏,因此軟件配置中省略此項。

2.2 修改GUI和觸摸屏配置文件

在調整系統或減小內存消耗時(shí)需配置LCDConf.h。具體步驟如下:(1)備份原始配置文件;(2)檢查所有配置開(kāi)關(guān);(3)刪除配置中不使用部分。除此之外,系統工程編譯時(shí),會(huì )出現一些未定義錯誤,需要將SampleGUI_XGUI_X.c添加到工程中,該文件定義GUI與操作系統的接口,以及Debug錯誤報告等函數。由于系統使用μ/OS II,可選擇GUI_X_uCOS.c文件,并在文件結尾處添加以下函數:
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,根據觸摸屏類(lèi)型不同,宏參數也不同。執行觸摸屏操作的主要流程在GUICoreGUI_TOUCH_DriverAnalog.c文件中。頭文件部分宏配置如表2所示。

2.3 觸摸屏與GUI接口

μC/GUI支持鍵盤(pán)、鼠標、觸摸屏等外設,并在源碼級對其消息響應。為使觸摸屏正常工作,系統除對相應配置文件修改和添加一些相關(guān)函數外,必須實(shí)現觸摸屏底層驅動(dòng),即修改LCDLin.c驅動(dòng)文件。

理論上,GUI_TOUCH_AD_LEFT和GUI_TOUCH_AD_RIGHT取值應當為0或1 024,但實(shí)際操作時(shí),必須根據具體情況校準。系統取觸摸屏四個(gè)角坐標作為校正標準,經(jīng)過(guò)多次試驗,四個(gè)坐標分別是(29,160)、(3 936,160)、(29,3 900)和(3 936,3 900)。在GUICoreGUI_TOUCH_DriverAnalog.c中修改相應宏,再據實(shí)際情形確定余下開(kāi)關(guān)宏的值。

通過(guò)調用GUI_TOUCH_Exec()函數來(lái)獲得觸摸屏觸點(diǎn)位置:系統通過(guò)中斷服務(wù)程序讀回觸點(diǎn)實(shí)際坐標值(x,y);接著(zhù)將實(shí)際坐標值轉換到邏輯坐標;最后調用GUI_TOUCH_StoreState(x,y)保存邏輯坐標值。為實(shí)時(shí)得到觸點(diǎn)坐標,需不斷調用GUI_TOUCH_Exec()函數,因此建立單獨任務(wù)對該函數調用,以保證觸摸屏任務(wù)的實(shí)時(shí)響應。該部分設計難點(diǎn)在于中斷標志清零,如果每次得到觸點(diǎn)位置后不能即刻清零,則會(huì )影響GUI內部去抖操作和校準處理,因此在保存穩定坐標值后再清除標志位。

3 μC/GUI應用開(kāi)發(fā)

3.1 觸摸屏

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


3.2 窗口、控件和對話(huà)框應用

系統界面豐富,頻繁用到頁(yè)面切換,因此使用?滋C/GUI視窗管理器(WM)進(jìn)行窗口創(chuàng )建、顯示、隱藏和刪除等。用戶(hù)程序中對不同窗口指定不同回調函數,當指定事件發(fā)生時(shí),通知圖形系統調用指定函數,如窗口內容改變時(shí)自動(dòng)重繪的場(chǎng)合等。圖3(a)、圖3(b)分別為菜品推薦及菜單顯示窗口。

為使點(diǎn)菜系統功能更加豐富,界面中加入按鈕、列表框、單選按鈕、框架窗口等控件??丶菢嬙煊脩?hù)接口的元素,能自動(dòng)對某些事件反應??丶彩峭ㄟ^(guò)其構造函數返回的句柄而引用??丶褂靡暣肮芾砥?,一旦一個(gè)控件建立,它被處理成與其他窗口一樣,WM保證它在需要時(shí)能正確顯示(及重繪)。

控件在使用中十分重要,包括按鈕觸碰響應、單選按鈕序列號獲取、列表框滑動(dòng)等。下面以按鈕為例介紹其功能。Button按鈕在其回調函數中對相關(guān)消息(WM_MOUSEOVER/WM_PID_STATE_CHANGED/WM_TOUCH)進(jìn)行處理,在button.c文件中可找到相關(guān)實(shí)現函數,用觸摸屏點(diǎn)擊該按鈕時(shí)發(fā)送以下三種消息之一:WM_NOTIFICATION_MOVED_OUT、WM_NOTIFICATION_RELEASED、WM_NOTIFICATION_PRESSED,之后在該按鈕父窗口捕獲并處理消息。系統是通過(guò)捕獲WM_NOTIFICATION_RELEASED消息實(shí)現按鈕觸碰功能的。

系統除了點(diǎn)菜外,還能存儲會(huì )員信息,用于累積會(huì )員積分,如圖3(c)。對于新建和登錄賬戶(hù)界面,使用對話(huà)框是很需要的。建立對話(huà)框需要做兩件基本工作:一個(gè)資源表,定義包括的控件;另一個(gè)是定義控件的初始化。對話(huà)框包含多個(gè)控件(框架窗口、按鈕、編輯框、文本框),通過(guò)對不同控件的選擇向系統發(fā)出請求信息。多數消息被對話(huà)框自動(dòng)處理,其他傳送給對話(huà)框指定的回調函數。其中,將WM_INIT_DIALOG和WM_NOTIFY_PARENT兩種類(lèi)型的附加消息傳送到對話(huà)框窗口進(jìn)行處理。對話(huà)框顯示前,WM_INIT_DIALOG消息立即被發(fā)送到對話(huà)框處理,對話(huà)框程序用這個(gè)消息初始化控件以及實(shí)現其他影響對話(huà)框顯示的初始化任務(wù);通過(guò)對話(huà)框的子窗口發(fā)送WM_NOTIFY_PARENT消息到對話(huà)框,通知父窗口以保證事件同步。

3.3μC/OS II應用

系統使用接口函數OSTaskCreateExt 創(chuàng )建任務(wù),根據系統要求,設計四個(gè)任務(wù),分別是:初始化任務(wù)(TaskStart)、接收消息任務(wù)(TaskRxmsg)、響應觸摸任務(wù)(TaskTouch)和更新任務(wù)(TaskUpdate)。任務(wù)間通過(guò)信號量、全局變量等方式通信,具體狀態(tài)轉移如圖4所示。

(1)初始化任務(wù)

優(yōu)先級別最高,用于建立和調用系統初始化函數。系統上電后,首先對各個(gè)硬件模塊、軟件內各數據初始化,如果SD卡讀取不成功、無(wú)線(xiàn)運行不正常,LED燈提示系統初始化失敗,同時(shí)系統退出運行狀態(tài)。反之,初始化完畢,系統開(kāi)始任務(wù)調度。

(2)接收消息任務(wù)

接收上位機傳回的確認信息,實(shí)時(shí)顯示菜單狀態(tài):準備中、制作中、傳送中和已上菜。由于無(wú)線(xiàn)發(fā)回數據不定時(shí),且為了避免數據丟失,該任務(wù)優(yōu)先級別高于TaskTouch。該任務(wù)與TaskTouch之間用信號量通信。

(3)響應觸摸任務(wù)

用于執行GUI_TOUCH_Exec()函數,更新觸摸點(diǎn)狀態(tài),設置窗口、對話(huà)框等的回調函數,進(jìn)行界面切換。放棄對CPU占用后,系統調度將CPU占用權交給TaskUpdate。

(4)更新任務(wù)

由于使用視窗管理回調機制,該任務(wù)必須實(shí)現,并定期調用(至少每秒鐘100次),優(yōu)先級別最低。僅從一個(gè)任務(wù)調用GUI更新函數(即GUI_Exec(),GUI_Delay()),有助于保持程序結構清晰。任務(wù)完成后,按任務(wù)優(yōu)先級高低開(kāi)始新一輪調度。

以μC/OS-II操作系統為基礎,系統在響應觸摸任務(wù)和更新任務(wù)中分別調用μC/GUI函數。該項工作通過(guò)在配置中使能多任務(wù)支持及配合內核接口函數來(lái)完成。由于任務(wù)實(shí)時(shí)行為只受運行在更高級別任務(wù)的影響,所以在低級別任務(wù)中設置用戶(hù)界面,使其切換到用戶(hù)界面時(shí)不會(huì )影響實(shí)時(shí)行為。

本文介紹的系統,在Nios II架構上移植了可視化圖形庫μC/GUI,系統重點(diǎn)研究了如何應用?滋C/GUI。在實(shí)現觸摸屏操作的基礎上,結合實(shí)現窗口、控件和對話(huà)框的使用,并融合多任務(wù)操作系統提高點(diǎn)菜的實(shí)時(shí)性。LTM觸摸屏顯示帶有Windows風(fēng)格圖形界面,顧客可根據菜品圖片、營(yíng)養介紹及價(jià)格隨時(shí)點(diǎn)餐。通過(guò)GUI整合的觸摸操作,實(shí)現了自助點(diǎn)菜、查看菜品狀態(tài)、加菜、退菜以及結賬功能,可提供更優(yōu)質(zhì)、更人性化的服務(wù)。



評論


相關(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>