<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        uC/OS ii與μc/gui移植詳細介紹

        作者:佚名   來源:本站原創   點擊數:  更新時間:2014年08月18日   【字體:

        uC/OS ii文件體系結構:

        1:核心部分(OSCore.c)
           這部分代碼是操作系統的核心,包括操作系統的初始化、操作系統運行、中斷進出的前導、時鐘節拍、任務調度、事件處理等多部分。能夠維持系統基本工作的部分都在這里。
        2:任務處理部分(OSTask.c)
           任務處理部分中的代碼內容都是與任務的操作密切相關的,包括任務的建立、刪除、掛起、恢復等待。因為uC/OS ii是以任務為基本單位進行調度的,所以這部分內容相當重要。
        3:時鐘部分(OSTime.c)
           uC/OS ii的最小時鐘單位是timetick(時鐘節拍)。任務延時等操作就是在這里完成。
        4:任務同步與通信部分
           這部分代碼為事先處理部分(需要在OS_cfg.h文件中進行功能選擇使能),包括信號量、郵箱、郵箱隊列、事件標志等部分,主要用于任務間的相互聯系和對臨界資源的訪問。
        5:CPU的接口部分(Ports)--需要移植的代碼部分
          這部分是需要根據具體的CPU來做移植,且這部分由于很多涉及到具體硬件,所以很多都是用匯編來寫。主要包括中斷級任務切換的底層實現、任務級任務切換的底層實現、時鐘節拍的產生和處理、中斷的相關部分等。
         
        uC/OS ii移植需要滿足的條件:
        1:處理器支持中斷,并能夠產生定時中斷(通常在10~1000HZ)
           uC/OS ii是通過中斷(軟)來實現任務現場的切換,做到任務的切換;uC/OS ii中需要時基函數來進行任務的延時等(uC/OS iii支持時間片輪轉,所以時基還用來做任務切換),M3中有一個硬件的systick定時器,專門用來產生定時中斷。
        2:在程序中可以打開或者關閉中斷
          uC/OS ii中,打開/關閉中斷主要通過OS_ENTER_CRITICAL()或OS_EXIT_CRITICAL()兩個宏實現,在任務的切換時,是需要關中斷的(進入臨界區)。
        3:處理器的C編譯器能產生可重入代碼
          uC/OS ii中,大部分函數都是用C編寫的,所以編譯時,需要產生可重入的代碼(可以被一個以上的任務調用),可重入代碼中不能使用全局變量,且可重入代碼中的局部變量一般使用CPU的通用寄存器或堆棧(這個需要編譯器支持),所以對編譯器是有要求的。
        4:處理器需具備一定量數據的硬件堆棧
          uC/OS ii中,有一些系統使用的數據結構(各種列表來管理系統的資源)需要一定的RAM空間,同時任務切換、局部變量等都需要使用堆棧,所以對RAM(堆棧也有要求),M3中,應用程序(PSP)與異常服務程序(MSP)使用的堆棧指針是不一樣的,這樣起保護作用。
        5:處理器有將堆棧指針和其他CPU寄存器 存儲與讀出到內存(堆棧)的指令
          uC/OS ii中,任務切換時一般要讀取CPU的各個通用與特殊功能寄存器,M3用MRS、MSR等命令。
        uC/OS ii的移植要點:
          uC/OS ii的移植相當LINUX來說是非常簡單的,uC/OS ii的移植涉及到的代碼很少;我們只需要修改與處理器相關的代碼即可;
          OS_CPU.H:設置與處理器與編譯器有關的代碼
          OS_CPU_C.C:在這其中用C語言編寫6個與操作系統相關的函數
          OS_CPU.ASM:在這其中用匯編語言編寫4個與處理器相關的函數
          如上圖,需要移植的部分就是Ports路徑下的幾個代碼文件,其他的代碼都不要移植(os_cfg.h只是用來配置系統的各個功能,做系統的裁剪而且,ucos_ii.h中提供系統所有的接口函數,os_cpu_a.asm就是OS_CPU.ASM
        1:修改OS_CPU.H
          OS_CPU.H中定義了數據類型、處理器的堆棧數據類型的字長、堆棧增長方向、任務切換宏、臨界區訪問處理。
          從方便移植的角度,uC/OS ii使用的數據類型,都是自己定義的那一套。
              typedef unsigned char  BOOLEAN;
              typedef unsigned char  INT8U;                   
              typedef signed   char  INT8S;                    
              typedef unsigned short INT16U;                   
              typedef signed   short INT16S;                  
              typedef unsigned long  INT32U;                  
              typedef signed   long  INT32S;                  
              typedef float          FP32;                    
              typedef double         FP64;   
                          
              typedef unsigned int   OS_STK;                  
              typedef unsigned int   OS_CPU_SR;          
           M3使用的是向下生長的滿棧,堆棧指針指向最后一個被壓入堆棧的32位整數:
              #define  OS_STK_GROWTH  
           定義開關中斷的宏:
              #define  OS_CRITICAL_METHOD   3
              #if OS_CRITICAL_METHOD == 3
              #define  OS_ENTER_CRITICAL()  {cpu_sr = OS_CPU_SR_Save();}
              #define  OS_EXIT_CRITICAL()   {OS_CPU_SR_Restore(cpu_sr);}
              #endif
           定義宏OS_TASK_SW執行任務切換:#define  OS_TASK_SW()         OSCtxSw()

        2:在OS_CPU_C.C中要求用戶編寫10個簡單的C函數【唯一必要修改的函數是OSTaskStkInit(),其余的函數必須聲明,但并不一定要包含任何代碼
        OSTaskStkInit():任務創建函數OSCreate()與OSCreateExt()通過調用OSTaskStkInit,初始化任務的棧結構,因此,任務的堆?雌饋砭拖駝偘l生了中斷一樣(所以的寄存器按一定的次序都保存在堆棧中,為什么要這樣做?因為任務間的切換就是任務堆棧中保存的CPU現場的切換,所以任務被創建時,要初始化它的堆棧,為后面的切換做準備)
        OSTaskCreateHook(ptcb):【系統提供給用戶的鉤子函數】任務創建時OSCreate()與OSCreateExt()調用OS_TCBInit,OS_TCBInit會調用OSTaskCreateHook,同時傳遞指向剛剛建立的任務的任務控制塊的指針,這樣OSTaskCreateHook就可以訪問任務控制塊結構的所有成員,這個函數的功能有限,不是必要的函數,且需要通過OS_APP_HOOKS_EN使能,且該函數調用時中斷是開著的。
        OSTaskDelHook(ptcb):OSTaskDel()會調用OSTaskDelHook(ptcb),即在將任務從uC/OS II的內部有效鏈表中刪除之前被調用,同時傳遞一個指向被刪除任務的任務控制塊的指針,OSTaskDelHook可以用來檢驗TCB擴展部分是否已建立(一個非空指針),并可進行一些清0操作,OSTaskDelHook調用時,中斷是關閉的,函數太長會影響中斷響應時間。
        OSTaskSwHook():在任務切換時會調用OSTaskSwHook,不論是在OSCtxSw()還是OSIntCtxSw(),都會調用該函數,OSTaskSwHook可訪問全局變量OSTCBCur(指向將被切換出去的任務的任務控制塊)、OSTCBHiggRdy(指向新任務的任務控制塊) ,OSTaskSwHook被調用時,中斷是關閉的,函數太長會影響中斷響應時間。
        OSTaskIdleHook():很多微處理器都允許執行相應的指令,將CPU置于低功耗模式,而當接收到中斷信號時,CPU就會自動退出低功耗模式。OS_TaskIdle()函數可以調用OSTaskIdleHook()來實現CPU的這種低功耗模式【很好】。
        OSTaskStatHook():該函數每秒都會被統計任務OS_TaskStat()【統計任務每秒執行一次】調用一次,可以通過該函數擴展統計任務的功能,如可跟蹤并顯示每個任務的執行時間、每個任務所用的CPU份額以及每個任務執行的頻率等等,該函數沒有任何參數。
        OSTimeTickHook():該函數在每個時鐘節拍都會被OSTimeTick()調用;systick中斷服務程序SysTickHandler調用OSTimeTickHook,在這里面用戶可以處理應急的事務。
        OSInitHookBegin():進入OSInit()函數后,OSInitHookBegin就會被調用,添加這個函數的原因在于想把與OS有關的初始化代碼也放在OSInti()函數中,這個函數使得用戶可以將自己特定的代碼也放在OSInit()函數中。
        OSInitHookEnd():OSInitHookEnd與OSInitHookBegin相似,只是他在OSInit()函數返回之前被調用,添加這個函數的原因與OSInitHookBegin是一樣的。
        OSTCBInitHook(ptcb):任務創建時OSCreate()與OSCreateExt()調用OS_TCBInit,OS_TCBInit會在調用OSTaskCreateHook前調用 OSTCBInitHook ,用戶可以在OSTCBInitHook函數中做一些與初始化控制塊OS_TCB有關的處理,在OSTaskCreateHook中做一些與初始化任務有關的處理;OSTCBInitHook收到的ptcb參數指向新添加任務的任務控制塊的指針,而這個新添加任務的任務控制塊絕大部分已經初始化完成,但是還沒有鏈接到已經建立任務的鏈表中。
        OS_STK * OSTaskStkInit (void (*task)(void *p_arg), 
                                void *p_arg, 
                                OS_STK *ptos, 
                                INT16U opt)
        {
            OS_STK *stk;
            (void)opt;                                
            stk       = ptos;    
            *(stk)    = (INT32U)0x01000000L;           //xPSR                                 
            *(--stk)  = (INT32U)task;                  //Entry Point                          
         *(--stk) = (INT32U)0xFFFFFFFEL; // R14(LR) (init value will cause fault if ever used)    
            *(--stk)  = (INT32U)0x12121212L;          // R12                                  
            *(--stk)  = (INT32U)0x03030303L;          // R3  
            *(--stk)  = (INT32U)0x02020202L;           // R2   
            *(--stk)  = (INT32U)0x01010101L;           //  R1    
            *(--stk)  = (INT32U)p_arg;                 // R0 : argument  

           //Remaining registers saved on process stack 
            *(--stk)  = (INT32U)0x11111111L;           // R11  
            *(--stk)  = (INT32U)0x10101010L;           // R10  
            *(--stk)  = (INT32U)0x09090909L;           // R9    
            *(--stk)  = (INT32U)0x08080808L;           // R8      
            *(--stk)  = (INT32U)0x07070707L;           // R7     
            *(--stk)  = (INT32U)0x06060606L;           // R6     
            *(--stk)  = (INT32U)0x05050505L;           // R5     
            *(--stk)  = (INT32U)0x04040404L;           // R4       
            return (stk);
        }
         
           
        3:在OS_CPU_A.ASM中用匯編寫4個與處理器相關的函數
           需要移植的函數有,如下所示,
           OSStartHighRdy():在調用OSStart()函數時,使就緒態任務中優先級最高的任務開始運行
           OSCtxSw():
           OSIntCtxSw():
           OSTickISR():
           OS_CPU_SR_Save()
           OS_CPU_SR_Restore():
         
        OSCtxSw():可以參考學習筆記中的記錄,M3中任務切換還需實現軟中斷的處理函數
        OSCtxSw   ;懸起PSV異常
            LDR     R0, =NVIC_INT_CTRL                                  
            LDR     R1, =NVIC_PENDSVSET
            STR     R1, [R0]
            BX      LR
         
        OSIntCtxSw():在退出中斷前調用OSIntCtxSw,在ISR中執行任務的切換功能,OSIntCtxSw與OSCtxSw基本相同,M3的是一模一樣的。

        OSPendSV 【軟中斷的處理函數】
            MRS     R0, PSP                                            
            CBZ     R0, OSPendSV_nosave                                
         
            SUBS    R0, R0, #0x20                                      
            STM     R0, {R4-R11}
         
            LDR     R1, __OS_TCBCur                                    
            LDR     R1, [R1]
            STR     R0, [R1]                                           
                      
        OSPendSV_nosave
            PUSH    {R14}                                               
            LDR     R0, __OS_TaskSwHook                                 ; OSTaskSwHook();
            BLX     R0
            POP     {R14}
         
            LDR     R0, __OS_PrioCur                                  
            LDR     R1, __OS_PrioHighRdy
            LDRB    R2, [R1]
            STRB    R2, [R0]
         
            LDR     R0, __OS_TCBCur                                   
            LDR     R1, __OS_TCBHighRdy
            LDR     R2, [R1]
            STR     R2, [R0]
         
            LDR     R0, [R2]                                          
            LDM     R0, {R4-R11}                                        
            ADDS    R0, R0, #0x20
            MSR     PSP, R0                                             
            ORR     LR, LR, #0x04                                       
            BX      LR   


        OSTickISR在這里即SysTickHandler函數
        void SysTickHandler(void)
        {
            OS_CPU_SR  cpu_sr;
            OS_ENTER_CRITICAL();  
            OSIntNesting++;
            OS_EXIT_CRITICAL();  
            OSTimeTick();     //主要判斷延時的任務是否計時到
            OSIntExit();  //在os_core.c文件里定義,如果有更高優先級的任務就緒了,則執行一次任務切換
        }

        OSStartHighRdy
            LDR     R0, =NVIC_SYSPRI2                                   
            LDR     R1, =NVIC_PENDSV_PRI
            STRB    R1, [R0]               //這幾句是設置PendSV優先級

            MOVS    R0, #0                                             
            MSR     PSP, R0          //設置PSP的初始值0(在第一次PendSV中斷服務程序中不用保存CPU的各寄存器)

            LDR     R0, __OS_Running                                 
            MOVS    R1, #1
            STRB    R1, [R0]             // OSRunning = TRUE,表明操作系統已經運行 

            LDR     R0, =NVIC_INT_CTRL                                 
            LDR     R1, =NVIC_PENDSVSET
            STR     R1, [R0]            //觸發PendSV中斷,暫時掛起

            CPSIE   I                   //開總中斷【一定要在這里才開總中斷,如果在此之前任何一個地方開中斷,系統一旦響應中斷,很有可能造成系統因沒有做出足夠的準備而出錯(比如如果在初始化systicks時就開啟了中斷,uC/OS此時還處于未知階段,就會崩潰),所在在這里開啟總中斷才是安全的                                       
         
        OS_CPU_SR_Save() 
            MRS     R0, PRIMASK   ;保存全局中斷標志  
            CPSID   I           ;關中斷
            BX      LR
        OS_CPU_SR_Restore()
            MSR     PRIMASK, R0    ;恢復全局中斷標志
            BX      LR
         
         
        【到此移植完畢】
         
        ---------下面談談uCGUI的移植------------------------------------------------------------------------------------------------------------------
         
           μc/gui與 uC/OS出于同一公司,是美國micrium公司出品的一款針對嵌入式系統的優秀圖形軟件。它是為任何使用lcd圖形顯示的應用提供高效的獨立于處理器及lcd控制器而設計的圖形用戶接口,它適用單任務或是多任務系統環境。架構基于模塊化設計,由不同的模塊中的不同層組成。包括液晶驅動模塊,內存設備模塊,窗口系統模塊,窗口控件模塊,反鋸齒模塊和觸摸屏及外圍模塊。其主要特性包括豐富圖形庫,多窗口、多任務機制,窗口管理及豐富窗口控件類(按鈕、檢驗框、單/多行編輯框、列表框、進度條、菜單等),多字符集和多字體支持,多種常見圖像文件支持,鼠標、觸摸屏支持,靈活自由配制等特性。
           如下圖,uCGUI中,有基于emWin與uCGUI的DEMO,其實兩個很類似;INC目錄下包含了所有圖形庫提供的功能函數接口,直接調用就好了,工程中圖形庫是以lib方式給出的。
         
         
        參考uCGUI中文手冊
        1:首先通過網絡上相關資料的介紹,大致清楚UCGUI的整個框架與需要移植的地方。
        2:結合uCGUI中文手冊與自己的開發板具體進行移植。
        ///////////////////////////////////////
        1:指針光標輸入設備(觸摸屏)

        指針光標輸入設備包括鼠標和觸摸屏。 它們共用一組通用的指針光標輸入設備(PID)函數使得鼠標和觸摸屏能同時起作用。 該函數一般由視窗管理器自動地調用,如前所述的那樣,起刷新顯示屏的作用。 如果視窗管理器未使用,你的應用程序要負責調用PID 函數。

         
         
         
         
         
        //////////////////////////////下面的內容是整理自網絡//////////////////////////////////////////

        0:準備工作

          

        在移植之前,首先要了解在網上下的UCGUI 3.90源碼包,且需要先寫好裸機下成功驅動LCD的驅動代碼。

        1)“tool文件夾”              基本都是字體和模板查看之類的.

        2)“sample文件夾”       是實例代碼和模版配置頭文件,如跟操作系統有關的GUI_X或者一些模板

        3)“Start文件夾”           是uCGUI的源代碼包 


        Config,配置文件;
        GUI/AntiAlias,抗鋸齒支持;
        GUI/ConvertMono,用于B/W(黑白兩色)及灰度顯示的色彩轉換程序;
        GUI/ConvertColor,用于彩色顯示的色彩轉換的程序;
        GUI/Core ??C/GUI,內核文件;
        GUI/Font,字體文件;
        GUI/LCDDriver,LCD 驅動;
        GUI/Mendev,存儲器件支持;
        GUI/Touch,觸摸屏支持;
        GUI/Widget,視窗控件庫;
        GUI/WM,視窗管理器;


        1: 定義/修改GUIConf.h、LCDConf.h 、GUITouchConf.h

             

            GUIConf.h : μc/GUI功能模塊、動態存儲空間(用于內存設備和窗口對象)大小、默認字體設置等 基本GUI預定                           義控制的定義

                           在圖形接口的配置文件GUIconf.h 的默認設置中,窗口

                       管理、存儲器支持、觸摸屏等功能被屏蔽。默認字體設置為

                       GUI_Font6x8。uC/GUI 同樣支持漢字的顯示,使用生成漢字

                       字庫的軟件,可以將Windows 操作系統內的任何字體字庫轉

                       換漢字字庫文件,也可以根據實際顯示的需要,將所需顯示

                       的漢字建立一個自定義字庫,添加到uC/GUI 中。文中選用

                       的漢字字庫文件為hzk16s.c(16×16 點陣的宋體漢字字庫),

                       uC/GUI 便支持16×16 點陣宋體漢字的顯示。

               

         

                #define GUI_OS                  (1)             //多任務 

                      #define GUI_SUPPORT_TOUCH       (0)             //觸摸 

                     #define GUI_SUPPORT_UNICODE    (1)             //Unicode支持 

                      #define GUI_DEFAULT_FONT         &GUI_Font6x8   //GUI默認字體 

                      #define GUI_ALLOC_SIZE           5000           //動態內存的大小 

                      #define GUI_WINSUPPORT           1              //窗口控件支持 

                      #define GUI_SUPPORT_MEMDEV       1              //支持內存設備 

                      #define GUI_SUPPORT_AA           1               


            LCDConf.h:LCD大小、控制器類別、總線寬度、顏色選取等LCD參數控制文件


         

                #define LCD_XSIZE           (160)    //配置TFT的水平分辨率 

                #define LCD_YSIZE           (128)    //配置TFT的垂直分辨率 

                #define LCD_CONTROLLER      (54124) //TFT控制器的名稱 

                #define LCD_BITSPERPIXEL    (16)     //每個像素的位數 

                #define LCD_FIXEDPALETTE    (565)    //調色板格式 

                #define LCD_SWAP_RB         (0)      //紅藍反色交換 

                #define LCD_INIT_CONTROLLER()    TFT_Init() ;  //此處需要定義的是你的TFT初始化函數 

            GUITouchConf.h:配備觸摸屏,根據觸摸屏及其控制芯片編制以下幾個函數

                void TOUCH_X_ActivateX (void);// 準備Y軸數據測量
             void TOUCH_X_ActivateY (void);// 準備X軸數據測量
             int TOUCH_X_MeasureX(void);    // 根據AD轉換結果返回X的值
             int TOUCH_X_MeasureY(void);    // 根據AD轉換結果返回Y的值

                 以上幾個函數在GUI_TOUCH_Exec()會被調用。     

                       

           GUI/CORE/LCD_ConfDefaults.h文件內可以找到所有囊括LCD配制默認選項,包括LCD屏個數,控制器個數 ,調色板,屏幕反向設置等眾多配制選項。

         

         

        2:LCD配置內容與驅動接口

            對于自帶控制器的LCD液晶屏,通過LCDConf.h文件中的總線接口和寄存器接口對硬件接口進行配置與定義;

            對于片上已經集成了LCD控制器的控制器,通過對片內LCD控制器的寄存器設置來配置LCD各接口信號;

            一般LCD的接口信息配置包括VFRAME幀同步信號,VLINE線同步脈沖信號,VCLK象素時鐘信號,VM信號和數據位不等的象素點數據輸出信號。

         

        3:LCD驅動底層實現

            LCD驅動編程的實質是液晶屏上的點對應的顯存編程,最底層調用函數為畫點函數,用戶可根據LCD屏的驅動控制器的實際情況(通過總線接口、寄存器接口或LCD控制器的寄存器來操作)來實現底層驅動。  

            _SetPixel(),_GetPixel(),XorPixel()為最底層直接對顯存操作函數。

            uc/GUI提供部分控制器驅動,文件為GUI/LCDDriver/LCDSLin.c,如sed1335,T6963等簡單LCD控制器。核心函數為LCD_Write().     _SetPixel()調用LCD_Write()寫顯存。 

                 uC/GUI 的圖形庫應用程序、漢字顯示、窗口等功能的實       

              現,都建立在底層的LCD 驅動和畫點功能的基礎上,uC/GUI

              的移植,必須先完成 LCD 的驅動,以及畫點、線等基本功

              能?刂破鱐FT3224 在驅動液晶顯示時,只需設置好顯示的

              行列坐標,向顯示寄存器寫入顯示數據,便實現顯示功能,

              而無需計算顯示存儲器和顯示區域的地址

         

              畫點程序如下:

              static void _SetPixel(int x, int y, LCD_PIXELINDEX c) 

              {

                  Y_ADDR = y;

                  X_ADDR = x;

                  CMD = ((x/256)<<2) | (y/256); //控制寄存器CMD 存放行列坐標的高位數據

                  DAT = c;     //數據寄存器DAT

              } 

         

              讓GUI能夠找到你的LCD驅動,修改LCDDriver。 

              在編寫你的TFT底層驅動程序的時候,一定不能忘記編寫這兩個函數:設置一個像素和獲取一個像素的顏       色,因為后面很多UCGUI和你的TFT驅動關聯起來需要這兩個函數為前提。以我的TFT為例: 

              void LCD_SetPixel(unsigned short x, unsigned short y, unsigned short color) 

             

              } 

             unsigned short LCD_GetPixel(unsigned short x, unsigned short y) 

            { 

             }


             uC/GUI 的驗證程序如下:

              …

             GUI_SetColor(GUI_WHITE); //設置前景色為白色

             LCD_L0_DrawHLine(0,100,100); //繪制水平直線

             GUI_InitLUT(); //初始化調色板

             GUI_DrawBitmap(&bm2,0,0); //繪制位圖,位圖文件為2.c

             GUI_SetFont(&GUI_FontHZ_Song_16);//設置當前字體16×16 宋體

             GUI_DispStringAt("uC/GUI 移植實現",10,40); //顯示漢字

             

          這兩個函數寫好,并測試可以正常顯示后,接下來需要修改TFT與UCGUI關聯的函數(在一個C文件下(我的是ili9320_ucgui.c),建議大家在移植GCGUI之前最好下載個別人移植好的例程,對著修改這樣難度降低很多): 

        int LCD_L0_Init(void) 

        {   

           TFT_Init(); 

           return 0; 

        這個函數,是GCGUI初始化TFT需要調用的,里面的函數就是你TFT底層驅動的初始化函數。 

        void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) 

           LCD_SetPixel(x,y,PixelIndex); 

        unsigned int LCD_L0_GetPixelIndex(int x, int y) 

           return LCD_GetPixel(x,y); 

        上面兩個函數是其他函數的最基本元素,其他函數比如畫線、點、圓都需要調用改函數。里面的LCD_SetPixel(x,y,PixelIndex)、LCD_GetPixel(x,y);就是你TFT底層驅動設置像素和獲取像素的兩個函數。 

        緊接著把該ili9320_ucgui.c文件下其他函數修改一下(凡是遇到設置像素和獲取像素的地方用以上兩個函數代替。) 

        接著,修改另一個C文件(ili9320_api.c)這里修改很簡單,僅僅也是將設置像素和獲取像素的函數替換掉自己定義的即可。 

        4:GUI_X文件夾內包括有與硬件聯系緊密的文件


           GUI_X文件夾下:

          GUI_X.C——無操作系統情況

          GUI_X_embOS.c——嵌入式操作系統

          GUI_X_ucos.c——UCOS環境下

           GUI_X.c包括大部分與硬件的關聯函數,如定時器的初始化和觸摸屏相關函數。

           uc/GUI與操作系統掛接的核心是定時器的設置和掛接。

           uc/GUI是通過延時函數GUI_Delay()調用GUI_X_Delay,再調用GUI_Exec()處理窗口部件中的回調函數進行重繪。在任何一款嵌入式操作系統中都需要定時器的心臟跳動作用,支持OS的uc/GUI可以通過定時器的設置達到嵌入式操作系統和圖形系統的實時和同步操作。在GUI_X_uCos.c中通過uc/os中的延時程序同μc/GUI掛接實現整合。


        4:移植完畢

        經過移植之后,GUI應用程序開發通過uc/GUI而變得非常容易,在調用GUI_Init()后,用戶可以根據需要正確配制uc/GUI后,可使用其強大的庫函數和豐富的GUI資源進行編程。在GUI編程過程中,可以打開抗鋸齒功能減小圖形失真,得到高質量的圖形和字體效果。采用內存設備能有效克服閃爍現象,獲得更快的顯示速度,但它和抗鋸齒功能一樣需要額外的內存開銷。

        關閉窗口
        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮