下面開始我的筆記!有興趣的兄弟們可以來看看。
step1.
下載uC/GUI的代碼。(廢話沒有源代碼移植個鳥)
我下載的時uC/GUI3.32這是能得到的源代碼中全的一個版本。
看看里面都有些什么東西。由于這里的發間大小的限制的問題不能上傳源代碼。很是郁悶。有需要的同志可以聯系我。Email:william7447@gmail.com

首先看看所有名叫Simulation的東西這是uC/GUI在VC中仿真的VC工程,他的仿真功能非常的實用可以在沒有具體硬件的情況下先行開發軟件,而絲毫不影響軟件的兼容性。但是有一個問題比較郁悶,就是速度的問題。大家知道嵌入式系統的CPU運算能力有限,而電腦的cpu.........我的整個項目的gui是在電腦上完成的。拿到目標系統上面編譯.......通過。
經過緊張的下載.....................
運行..........顯示出了個畫面,無比的興奮。但測試發現極其郁悶而幾乎無法解決的問題......目標系統的處理能力只有100mips而我的電腦的cpu是P4 3.0。速度的差別太大了。解決這個問題幾乎成了我后半段工作的主題。
GUI文件夾存放全部uC/GUI源代碼的地方

看看它的屬性有多達390個文件,全部是.c和.h。可以看出GUI系統是一個龐大復雜的東西。我在調試系統的時候跟蹤過完 整的消息循環再進入了60多個子函數調用后還沒有看到希望,就徹底的放棄了跟蹤的想法。下來會具體說明這里面都有些什么東西。
config文件夾uC/GUI的配置文件夾。里面存放的是uC/GUI的配置頭文件。改動里面的相應的就可以改動uC/GUI的配置。
這個GUI功能十分強大。我也在探索之中。
這幾天剛剛入門,只能說我自己的移植過程,以后陸續添上它的使用。有什么不對的地方大家請指出來。
uC/GUI移植之準備工作。
先來看看吧uC/GUI移植到NIOS II都要準備些什么東西。
首先就是要了解uC/GUI的源代碼包括了一些什么東西。
前面提到了這個gui有兩個文件夾一個GUI存放gui的核心文件,一個config為gui提供配置信息。
先看core里面有什么東西。

GUIAntiAlias 抗鋸齒支持,看上去挺牛的。
根據對抗鋸齒的使用發現,uC/GUI的抗鋸齒的效果好壞主要取決于系統的發色數,即系統的色彩表現能力,例如系統僅有灰度顯示能力的時候,uC/GUI在對一條直線進行處理的時候它是在直線的兩側添加顏色較淺的點來實現抗鋸齒的。效果十分明顯。
GUIConvertMono (b/w)和灰度顯示的色彩轉換支持。
GUIConvertColor 彩色顯示的色彩轉換支持
實際上就是色彩空間變換,為什么需要色彩轉換呢?
在gui內部定義了一套調色板及色彩的數據格式,但是有的控制器的色彩數據格式和gui內部定義的并不一樣,甚至色彩的數量(即lcd的發色數)也不同,這樣就需要將兩種不同的數據格式進行轉換。這樣才能在lcd上看到正常的顏色。
GUICore µC/GUI 核心文件,提供了GUI基本的功能,比如畫點,畫線,為圖之類的東西。什么窗口,窗口控件都是基于這些基本功能的。
GUIFont 不用多說了
GUILCDDriver LCD控制器。下面會說這個東西。
GUIMemDev Memory device 支持。這個東西可用在很多情況下,但主要的功能是防止在項目重疊時,防止屏幕的閃 爍。如果沒有Memory device 的支持數據會直接寫到控制器中去,這樣當進行各種屏幕跟新的時候就會出現閃爍現象。如果有Memory device 支持,就會避免這種現象。具體的還沒有測試,不過看說明是蠻牛的。關于這個東西會有一個較詳細的測試。
GUITouch Touch-panel 支持。雖然說是支持,甚至連鼠標都支持,但是底層驅動程序的四個函數是空的需要用戶自己添加內容,我們使用mxb7843這個四線電阻觸摸屏控制器。班子還沒有做好,做好就測試。
GUIWidget 窗體控件庫,功能強大,提供諸如按鈕,文本框之類的復雜的功能。
GUIWM 窗口庫。
widget wm配合memory device使用功能強大。
下面看看CONFIG文件夾
三個文件:
GUIConf.h
GUITouchConf.h
LCDConf.h
看名字也知道干什么的了。
下面一個一個說。
#ifndef GUICONF_H
#define GUICONF_H
#define GUI_OS (1) /* 多任務支持,如果使用rtos就打開這個選項,除了自家的ucos,別的rtos也支持*/
#define GUI_SUPPORT_TOUCH (1) /* 支持觸摸屏*/
#define GUI_SUPPORT_UNICODE (1) /*unicode字符串支持,能顯示中文的哦,只要能把字庫放進來,現在的問題我把字庫放不進來,文件太大了,編譯器限制,郁悶!*/
#define GUI_DEFAULT_FONT &GUI_Font6x8/*默認字體*/
#define GUI_ALLOC_SIZE 12500 /* WM 和 memory devices分配的動態內存*/
/*********************************************************************
*
* Configuration of available packages
*/
#define GUI_WINSUPPORT 1 /* Window manager package available */
#define GUI_SUPPORT_MEMDEV 1 /* Memory devices available */
#define GUI_SUPPORT_AA 1 /* Anti aliasing available */
這三個不用說了吧!
#endif /* Avoid multiple inclusion */
GUITouchConf.h這個文件........由于硬件不到位沒有深入研究觸摸這塊還不太理解,日后補上。
LCDConf.h這個文件比較特別,隨著控制器的不同,內容而不同。
如果針對的是硬件控制器,就會在這個文件里面定義控制器的基地址,所有的寄存器,顯示內存的地址鏡像關系,等等一系列硬件控制器的特征信息。當然了還會定義lcd的尺寸,調色板,等一些重要的信息。還有救治針對不同的lcd的設置,配置不同的控制器初始化代碼。
還有一種就是MEM控制器。就是沒有硬件控制器在內存里面申請一個和LCD物理象素點一一對應的內存區域作為顯示緩沖區,然后由用戶想辦法把數據送到LCD上去。他給的例子里面是用定時中斷來模擬LCD控制的控制時序,將數據流送到LCD上。在該模式下如果是一個很小lcd該方法很好節省了硬件成本。但是大量占用CPU刷新率低。如果lcd象素很高,那就是個問題了。但是在某些應用中不得不使用這種方式。在我的工程里面就使用了這種方式。
我的屏640*480*3bit。
這里有關硬件的控制器是一個大問題,即底層的驅動程序怎么辦?uC/GUI提供了很多的芯片的驅動程序,但是如果選用的芯片沒有怎么辦?或者屏的參數比較奇怪怎么辦?比如我用的屏640*480*3bit,就是8色的那種,一般的屏都是16色。我打算在過年的時候開一個有關驅動程序的專題,討論這些問題。還有驅動程序的效率對整個gui的效率影響很大。
準備就這么多該說說移植了。
該移植了!
首先弄個NIOS II系統。
然后打開NIOS II IDE創建一個工程。
什么都可以!我使用的Hello World這個工程。使用例子的好處省心。
然后找到這個工程的在硬盤中的物理位置,將下載的代碼中的兩個文件夾GUI和config拷貝進去該軟件工程的目錄里面。
由于前一段的工作是基于Altera Fpga 的用的就是NIOS II處理器,后面我會專門針對arm來討論相關的問題,近的項目是基于arm9的。

圖中就是copy好的目錄。
然后回到NIOS II IDE refresh工程就能看到ide自動將這兩個文件加添加進了工程,還有里面所有的文件。
但是不是所有的文件都是有用的,nios II的編譯器會把所有的文件編譯,這樣在鏈接的時候就出問題了,因為有的文件是針對不同的配置寫的。但是所有的都被編譯了,這樣子就導致大量的鏈接錯誤,無數重復定義。這就需要將無用的文件從工程中清除。一個地方就是LCDDrivers由于底層的繪圖函數是在drivers里面定義的所以有多少個drivers就會有多少個同樣名稱的函數。這里就需要將無用的driver清除。還有一個地方就是gui/core里面GUI_DrawBMP.c和GUI_DrawBitmap.c著兩個文件內容一模一樣,一字不差!所以要清除一個!還有一個重要問題是文件的包含路徑。nios ide不是自動添加文件包含路徑的,用慣了ads的人特不習慣。而且在5.1包含路徑設置位置比較難找!在這里添加四個路徑:
E:FPGALcdsoftwarehello_world_0Config
E:FPGALcdsoftwarehello_world_0guiCore
E:FPGALcdsoftwarehello_world_0guiWM
E:FPGALcdsoftwarehello_world_0guiWidget

還有就是要在系統庫中加上ucos。uC/GUIi默認打開多任務支持。
包含好了路徑就可以編譯了。
但是提示還有鏈接錯誤!
非常郁悶,怎么看也看不出來怎么回事。提示一個字體未定義!
關鍵還是默認字體!
經過仔細察看發現一個問題!!!!大家看看圖就明白了!
NIOS II IDE使用java開發的,java大小寫敏感!這點還是Windows作的好。

還有一個問題就是優化級別的問題,我發現在NIOS II系統里面most級別的優化和none的優化(就是不優化)執行速度能差2~3倍。特別是一些計算密集型的代碼例如:crc和gui應用。
這回編譯就沒有錯誤了!GUI初步移植成功,下來測試一下!由于沒有硬件支持只能看看軟件的。調試工程用內存查看器,就看到了uC/GUI的運行的結果。
執行下面的語句:
int main() {
LCD_Part = 0;
alt_irq_register ( LCM_0_IRQ,
(void*)0,
LCD_isr);
alt_irq_enable(LCM_0_IRQ);
GUI_Init();
GUI_DispChar('A'); /*顯示一個A*/
printf("Hello from Nios II! ");
while(1) {
}
return 0;
}
我用的是MEMC驅動程序,即把GUI執行的結果保存到內存中。這樣子才有了直接察看內存來看結果BT方法。
可以在內存查看器中看到數據的變化(由于數據量巨大,只列出頭幾列的數據)
1f f0 00 ...
e0 0e 00 ...
e0 0e 00 ..
ff fe 00 ...
e0 0e 00 ..
e0 0e 00 ..
e0 0e 00 ..
00 00 00 ...
轉化為二進制
000111111111000000
111000000000111000
111000000000111000
111111111111111000
111000000000111000
111000000000111000
111000000000111000
000000000000000000
我的屏是RGB三色屏共有8種顏色,0表示該點滅,1表示亮。3位表示一個彩色的象素點。能看出來由1組成了一個A嗎?
GUI初步抑制成功,下面將探索它的各種功能。(這部分著在摸索,每天弄一點,跟新可能會很慢!)
使用MEMC是因為這種方式的移植簡單根本不牽扯硬件,而且因為項目經費緊張,不可能買一個獨立的控制器,特別是體現不出來FPGA的優勢。這里的控制器是一個自己寫的小東西,實現的對LCD的控制,這部分正在測試,測試好了也會拿出來給大家共享的。
下來的幾天主要測試uC/GUI的復雜應用。包括widget, wm這些東西。
uC/GUI Simulation的應用
uC/GUI提供了一格功能是強大的工具,即Simulation工具他可以在windows環境下模擬uC/GUI的運行結果,為GUI應用程序的開發體供了極大的方便,在模擬器上開發GUI應用程序代碼可以幾乎無修改的直接應用于目標硬件。
這個模擬器的原理是GUI程序運行后產生一個實時更新的BMP圖片然后由gui模擬程序顯示出來。這個功能作得太好了,這樣子gui程序的開發簡直是了。
在下載的uC/GUI源代碼中,解壓后就能看到一個名叫Simulation的VC6Workspace和project。
在頂樓的圖中可以清楚地看到這兩個文件。這是uC/GUI的開發人員幫我們做好的。直接打開這個工程就可以在VC6中開發GUI應用程序,uC/GUI高度抽象,應用程序與底層很好的分離,這樣為GUI應用程序的開發提供了極大的方便。
下面打開這工程看看里面有什么東西。我使用的VS.Net。沒有什么區別,個人認為VS.Net的功能較VC6強大許多。是一個的集成開發環境。
打開工程后我們看看里面都有些什么東西。

config和gui文件加我們前面都說過了,里面放的就是Gui的配置文件和gui的源代碼。
這里面多了幾個文件夾。
Application文件夾,用戶存放應用程序文件的地方。
Simulation文件夾模擬器提供初始化和一些配置信息,我們根本不用改動這些東西。
System文件夾,大家知道每個C程序都有一個main函數,這里面就放了這一個東西。
還有一個地方,就是LCD_Driver這個文件夾里面放的是LCDWIN.c這樣無論你怎么修改GUI的配置,模擬器都會使用這個驅動程序來實現GUI程序運行結果的正確的顯示。
LCDWin.c就是基于windows模擬器的驅動程序,就是通過這個驅動生成模擬器里顯示的bmp圖片。
弄清楚這些東西,就可以開始uC/GUI編程了。
打開MainTask.c這個文件我們就在這里面編寫我們的GUI應用程序。
#include "GUI.h"
extern const GUI_BITMAP bmMicriumLogo;
extern const GUI_BITMAP bmMicriumLogo_1bpp;
下面是自帶的一段示例代碼。
我們來看看她都干了些什么東西。
/*
*******************************************************************
*
* main()
*
*******************************************************************
*/
void MainTask(void) {
int Cnt =0;
int i,YPos;
int LCDXSize = LCD_GET_XSIZE();
int LCDYSize = LCD_GET_YSIZE(); /*取得lcd物理尺寸,這個參數是在lcdconf.h里面定義的*/
const GUI_BITMAP *pBitmap; /*一個指向預顯示的位圖的指針,在這里位圖是在.c文件里面存儲的ps:.c的體積大的吹牛*/
GUI_Init(); /*初始化GUI,這誰痘看得出來*/
/*這里面除了初始了在guiconf.h里面定義的時用的GUI的所有功能,包括widget,wm等功能的初始化,當然還有lcd的控制器的初始化*/
GUI_SetBkColor(GUI_RED); GUI_Clear(); /*設置背景顏色為RED,其結果如圖*//*

/*說明一下這個模擬器的窗口,的那個窗口顯示的就是GUI程序的運行結果。標題里顯示的是當前LCD的配置參數,colors顯示的當前gui系統能顯示的所有的顏色,即調色板。log是gui的日志,這個功能會在后面說明*/
GUI_Delay(1000); /*延遲1000個時鐘節拍,這里我們的gui是應用在ucos rtos上面,這里的時鐘節拍就是ucos的時鐘節拍*/
GUI_SetBkColor(GUI_BLUE); /*背景設為BLUE*/
GUI_Clear(); /*清除當前的window,沒有窗口就清理整個屏幕*/
GUI_Delay(1000);
GUI_SetColor(GUI_WHITE);
for (i="0"; i<1000; i+=10) {
GUI_DrawHLine(i,0,100);
GUI_DispStringAt("Line ",0,i);
GUI_DispDecMin(i);
} /*這段代碼的功能就是每隔10行顯示文字line和一條直線。*/

GUI_Delay(1000);
GUI_SetColor(0x0); //設置顯示顏色為黑色!?黑色對著呢!1時點亮0是熄滅你看看是不黑色。
GUI_SetBkColor(0xffffff);
for (i="0"; i<160; i++) {
int len = (i<80) ? i : 160-i;
GUI_DrawHLine(i,20,len+20);
} //顯示一個三角形

GUI_Clear();
if (LCD_GET_YSIZE()>(100+bmMicriumLogo_1bpp.YSize)) {
pBitmap=&bmMicriumLogo; //設置要顯示的位圖為MicriumLogo
} else {
GUI_SetColor(GUI_BLUE);
pBitmap=&bmMicriumLogo_1bpp;
}
GUI_DrawBitmap(pBitmap,(LCDXSize-pBitmap->XSize)/2,10);
YPos="20"+pBitmap->YSize; //顯示位圖MicriumLogo
GUI_SetFont(&GUI_FontComic24B_1);
GUI_DispStringHCenterAt("www.micrium.com",LCDXSize/2,YPos); //在指定位置以FontComic24B_1字體顯示文字www.micrium.com
GUI_Delay(1000);
GUI_SetColor(GUI_RED);
GUI_DispStringHCenterAt("?2002 ", LCDXSize/2,YPos+30);
GUI_SetFont(&GUI_Font10S_1);
GUI_DispStringHCenterAt("Micri祄 Inc.",LCDXSize/2,YPos+60);; //在指定位置以Font10S_1字體顯示文字Micrium Inc
GUI_Delay(1000);
}
截圖

一個完整的gui應用程序的例子就出來了。接下來將是gui應用程序的開發。
從簡單的文字到window到復雜的控件。
一步一步來,我也在學習。
在硬件控制器徹底搞定之前都將使用這個東西開發應用程序。