μC/GUI是一種專為嵌入式應(yīng)用設(shè)計的通用圖形接口軟件。本文詳細介紹了μC/GUI的結(jié)構(gòu)框架和基于STM32平臺的μC/OS-II上的μC/GUI移植過程,并在此基礎(chǔ)上進行圖形界面設(shè)計;闡述了μC/GUI的窗口管理機制,提出了實現(xiàn)μC/GUI中文小型字庫的兩種方法并采用存儲設(shè)備解決了圖形顯示的閃爍問題。
嵌入式系統(tǒng)的圖形用戶界面,要求具有占用資源少、性能高、可靠性高、可移植、可配置等特點,μC/GUI就是這樣一種專門為嵌入式應(yīng)用設(shè)計的圖形用戶界面軟件。μC/GUI可應(yīng)用于多任務(wù)環(huán)境中,同時使用實時操作系統(tǒng)與μC/GUI,既可以發(fā)揮優(yōu)先級的實時性,又能實現(xiàn)良好的人機界面。本文使用Cortex-M3內(nèi)核的STM32平臺,介紹了基于STM32平臺的μC/OS-II上的μC/GUI移植過程,并在此基礎(chǔ)上開發(fā)了基于μC/GUI的圖形用戶界面。
1 μC/GUI結(jié)構(gòu)框架
1.1 μC/GUI的文件組織
μC/GUI軟件采用模塊化組織架構(gòu),其中較為重要的文件目錄是配置文件目錄Config和GUI庫文件目錄。考慮到未來升級方便,建議保持μC/GUI原有的目錄結(jié)構(gòu),這樣升級到新版本時只要覆蓋原文件目錄即可,而不會改變整個工程的文件路徑。
μC/GUI是一個源代碼開放的圖形系統(tǒng),它提供了豐富的資源,包括二維繪圖庫,多字體、可擴充的字符集,UnICode,位圖顯示,多級RGB顏色管理及灰度處理調(diào)整機制,動畫優(yōu)化顯示,具有Windows風格的對話框和預定義控件(按鈕、編輯框、列表框、進度條、單選復選框、滑動條等);同時,支持鍵盤、鼠標、觸摸屏等輸入設(shè)備和雙LCD的輸出,提供占用極少RAM的窗口管理體系。各個子目錄的路徑及功能支持如表1所列。
1.2 μC/GUI的層次結(jié)構(gòu)
μC/GUI內(nèi)核提供多種圖形顯示功能,用戶程序通過API函數(shù)接口調(diào)用μC/GUI函數(shù)庫中的各個功能函數(shù),然后各個功能函數(shù)通過調(diào)用硬件驅(qū)動實現(xiàn)圖形界面顯示。
一個典型的包含有μC/GUI的軟件系統(tǒng)可以理解為一個層次結(jié)構(gòu),詳細的μC/GUI軟件體系的層次結(jié)構(gòu)如圖1所示。
2 基于STM32平臺的μC/GUI移植
2.1 STM32F103系列單片機和移植平臺簡介
硬件開發(fā)平臺的核心是ST公司的STM32F103系列單片機,實時操作系統(tǒng)選擇移植性較強的μC/OS-II。STM32F103系列單片機最高主頻為72 MHz;片內(nèi)多達51 2 KB的Flash并可以直接運行程序,片內(nèi)還有64 KB的RAM;擁有眾多的定時器、中斷源和外設(shè),內(nèi)部集成了一個高速外部存儲器接口FSMC總線,可以很方便地控制液晶顯示模塊。目標平臺的液晶模塊采用320×240分辨率,通過FSMC總線接口連接STM32F103單片機,并在系統(tǒng)的內(nèi)存區(qū)開辟一塊內(nèi)存作為液晶顯示的后臺緩存。
2.2 μC/OS-II上的μC/GUI移植
μC/GUI的移植內(nèi)容主要分成4部分:μC/GUI配置文件的參數(shù)修改,LCD驅(qū)動程序的編寫,LCD觸摸屏驅(qū)動程序編寫,以及與μC/OS-II操作系統(tǒng)相關(guān)接口部分的修改。
2.2.1 μC/GUI配置文件的參數(shù)修改
主要是根據(jù)系統(tǒng)的實際情況對GUI/Config目錄下3個配置文件的參數(shù)進行修改,設(shè)計采用的LCD選用320×240的液晶顯示模塊,LCD控制器采用ili9320。
①LCDConf.h文件主要定義LCD控制器和顯示屏尺寸及可選擇的功能。修改如下:
2.2.2 LCD驅(qū)動程序的編寫
LCD的驅(qū)動程序在GUI/LCDDriver目錄下,在本次移植中編寫的ili9320.c驅(qū)動文件主要定義了GUI與LCD的硬件接口函數(shù),包括畫點、線、矩形、多邊形、位圖等二維圖形的函數(shù)等等。μC/GUI所有的系統(tǒng)函數(shù)都是通過調(diào)用這些硬件接口來實現(xiàn)其功能的,而這些接口函數(shù)又可以通過調(diào)用畫點函數(shù)來實現(xiàn),可以認為幾乎所有的μC/GUI顯示功能都是通過最終調(diào)用畫點函數(shù)來實現(xiàn)的。所以筆者的LCD驅(qū)動程序重點在畫點函數(shù)的編寫。代碼如下:
2.2.3 LCD觸摸屏驅(qū)動程序的編寫
STM32F103通過SPI總線與觸摸屏芯片相連,通常的方法是采用輪詢的方法獲取觸摸屏的觸點動作,這種方法不僅實時性差而且浪費單片機的執(zhí)行周期。采用觸摸屏的觸點動作通過外部中斷進行檢測,在中斷服務(wù)程序中獲取觸點的位置坐標,并通過調(diào)用函數(shù)GUI TOUCHStoreSta te(xScreen,yScreen),將觸點坐標保存并通知μC/GUI。由于觸摸屏和LCD的大小不一定完全相等,坐標原點的位置也可能不同,為了實現(xiàn)對應(yīng),需要進行A/D轉(zhuǎn)換,實現(xiàn)數(shù)值到邏輯坐標的轉(zhuǎn)換。
2.2.4 操作系統(tǒng)相關(guān)接口部分的修改
μC/OS-II操作系統(tǒng)下使用μC/GUI需要提供一些內(nèi)核接口函數(shù)來實現(xiàn)任務(wù)間同步。有了這些內(nèi)核接口函數(shù),就可以使μC/GUI運行于μC /OS-II系統(tǒng)上,通過任務(wù)調(diào)度來實現(xiàn)各個任務(wù)之間的協(xié)調(diào)工作,接口函數(shù)實現(xiàn)如下:
至此,μC/GUI的移植就基本上完成了,需要編寫測試用例,如果顯示效果不理想,再對移植的GUI進行底層配置優(yōu)化和改進。
3 μC/GUI的圖形界面設(shè)計
μC/GUI是具有類似Windows窗口風格的圖形系統(tǒng),以其窗口作為內(nèi)存管理的基本單元,采用消息傳遞機制和回調(diào)函數(shù)機制。μC/GUI提供給窗口和窗口控件回調(diào)機制的背后,是一個事件驅(qū)動標志(即消息)。回調(diào)函數(shù)的過程也是消息傳遞的過程。
3. 1 μC/GUI的窗口管理機制
μC/GUI的窗口管理器用于管理LCD屏幕上圖形顯示的區(qū)域(即窗口),使其重疊、嵌套和并列。使用μC/GUI窗口管理時,任何能顯示在顯示終端上的內(nèi)容都包含在一個窗口中,這個窗口是LCD屏幕上的一個給用戶畫圖或者顯示目標的區(qū)域。窗口的創(chuàng)建、顯示以及刪除都離不開消息傳遞和回調(diào)函數(shù)機制。
在μC/GUI中定義了數(shù)十種用于各類基本操作的消息宏,對每個窗口的操作都是通過向其對應(yīng)的回調(diào)函數(shù)傳送消息參數(shù)來完成的?;卣{(diào)函數(shù)是由用戶定義的,當特定事件發(fā)生時,指示圖形系統(tǒng)調(diào)用特定的函數(shù)。當窗口的內(nèi)容發(fā)生改變時,它們用來自動重繪窗口。具體操作是通過一個指向函數(shù)的指針從窗口結(jié)構(gòu)體數(shù)據(jù)項中得到回調(diào)函數(shù)的首地址,并將消息作為參數(shù)調(diào)用該函數(shù)來完成的,回調(diào)函數(shù)在接收到消息后進行相應(yīng)處理。
回調(diào)函數(shù)的基本作用是實現(xiàn)窗口刷新。一個簡單的自動更新窗口的回調(diào)函數(shù)如下:
3.2 μC/GUI實現(xiàn)中文小型字庫的兩種解決方法
μC/GUI帶有多種常用的ASCII字體,也支持UNICODE字符顯示,考慮到嵌入式系統(tǒng)內(nèi)存資源有限,沒有裝入漢字庫,可以根據(jù)系統(tǒng)的實際需要建立一個小型漢字庫,以解決漢字的顯示問題。在μC/GUI下筆者提出兩種實現(xiàn)中文小型字庫的解決方法。
(1)在μC/GUI的字庫結(jié)構(gòu)體中建立一種新的字體
μC/GUI的文字顯示是通過查找字模的方式實現(xiàn)的。字庫中的每個文字都有其對應(yīng)的字模,所有的字模都是由GUI FONT和GUI FONT PORT這兩個結(jié)構(gòu)體來管理的。從漢字庫中選取必需的漢字組成字庫,并將漢字對應(yīng)的不連續(xù)漢字機內(nèi)碼映射到一個連續(xù)區(qū)域。此時需要建立一個GUI_FONT_PROP結(jié)構(gòu)來管理所有的漢字。例如,要實現(xiàn)“設(shè)置”這2個字,具體的偽代碼如下:
(2)直接建立漢字庫,通過LCD驅(qū)動直接顯示漢字
該方法通過將漢字的機內(nèi)碼和漢字點陣組合成一個漢字字模結(jié)構(gòu)體,然后選取所必需的漢字,按照漢字字模結(jié)構(gòu)體的方式存放在漢字庫數(shù)組中,然后通過調(diào)用一個“漢字搜索函數(shù)”來搜索這個漢字庫數(shù)組的機內(nèi)碼即可確定相應(yīng)的漢字,并把漢字對應(yīng)的點陣通過LCD驅(qū)動直接
進行顯示。
上述的兩種方法都能在嵌入式的圖形界面中實現(xiàn)中文顯示,方法二為通過LCD驅(qū)動直接顯示漢字,適合在窗體中顯示漢字,而不能在控件上直接顯示漢字。雖然可以用疊加的方法(即先畫一個控件,然后再在上面顯示漢字),但是這樣處理很不方便。方法一是在μC/GUI的字庫中建立了一種新的字體,因此在控件上顯示漢字時直接調(diào)用μC/GUI函數(shù)即可,不會出現(xiàn)上述問題,因此筆者推薦使用方法一實現(xiàn)μC/GUI的中文小型字庫。
3.3 采用存儲設(shè)備解決圖形顯示的閃爍問題
采用存儲設(shè)備可以有效地防止顯示屏在對有對象重疊的繪圖操作時的閃爍現(xiàn)象。沒有使用存儲設(shè)備時,繪圖操作直接寫屏,屏幕在繪圖操作執(zhí)行時更新,當不同的更新在執(zhí)行時會產(chǎn)生閃爍。如果這樣的操作使用一個存儲設(shè)備的話,那么所有的操作在存儲設(shè)備內(nèi)執(zhí)行,具有無閃爍的優(yōu)點。μC/GUI的存儲設(shè)備是一個可選的軟件項目,為了優(yōu)化軟件的性能,提高圖形的顯示效果,需要采用存儲設(shè)備技術(shù)。μC/GUI中存儲設(shè)備的使用一般流程為建立存儲設(shè)備、激活、執(zhí)行繪圖操作將結(jié)果拷貝到顯示屏顯示,最后將創(chuàng)建的存儲設(shè)備刪除。
4 結(jié)論
為了驗證移植丁作成功與否,需要建立一個多任務(wù)測試用例,這個用例由3個任務(wù)構(gòu)成:Main Task、GUITask、APP_Task。其中:Main_ Task任務(wù)用于設(shè)置背景窗口的回調(diào)函數(shù)和建立另外兩個任務(wù);APP_Task任務(wù)用于建立一個窗口并設(shè)置其相關(guān)的屬性;GUI_Task任務(wù)用于視窗管理和多級圖形畫面的切換。將測試用例燒寫進目標板,目標板采用神舟III號STM32開發(fā)板,液晶屏為320×240像素的TFT型液晶屏幕。圖2為測試用例在目標板上的運行結(jié)果。
評論