歡迎您光臨本站 登入註冊首頁

uC/GUI NIOS II移植及應用筆記

admin @ 2014-03-26 , reply:0

概述

這是前些日子在使用uc/GUI的時候即下來的一些東西原來發布在EDACN的bbs上面。現在不知道沉到哪裡去了。現在把它重新整理髮布在這裡。隨後在明年過年的時候把後續的幾個高級主題整理出來。下面開始我的……

這是前些日子在使用uc/GUI的時候即下來的一些東西原來發布在EDACN的bbs上面。現在不知道沉到哪裡去了。現在把它重新整理髮布在這裡。隨後在明年過年的時候把後續的幾個高級主題整理出來。

下面開始我的筆記!有興趣的兄弟們可以來看看。

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這些東西。

[admin via 研發互助社區 ] uC/GUI NIOS II移植及應用筆記已經有2744次圍觀

http://cocdig.com/docs/show-post-43084.html