wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

專注電子技術學習與研究
當前位置:單片機教程網 >> 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,初始化任務的棧結構,因此,任務的堆棧看起來就像剛發生了中斷一樣(所以的寄存器按一定的次序都保存在堆棧中,為什么要這樣做?因為任務間的切換就是任務堆棧中保存的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 的驅動,以及畫點、線等基本功

      能。控制器TFT3224 在驅動液晶顯示時,只需設置好顯示的

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

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

 

      畫點程序如下:

      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編程過程中,可以打開抗鋸齒功能減小圖形失真,得到高質量的圖形和字體效果。采用內存設備能有效克服閃爍現象,獲得更快的顯示速度,但它和抗鋸齒功能一樣需要額外的內存開銷。

關閉窗口
中文乱码字幕高清在线观看| 丁香啪啪综合成人亚洲| www.超碰97| 被男人吃奶添下面好舒服动态图| 亚洲成人中文字幕在线| 黄色网页网址在线免费| 亚洲视频1区| 欧美写真视频网站| 成人免费视频网站入口| 国产全是老熟女太爽了| 顶级欧美妇高清xxxxx| 成人不卡视频| 91亚洲大成网污www| 久久精品99久久久香蕉| 免费无码国产v片在线观看| 国产精品无码免费播放| 97视频精彩视频在线观看| 亚洲激情av| 91精品久久久久久久91蜜桃| 日本10禁啪啪无遮挡免费一区二区 | 久久成人在线视频| 日韩精品免费播放| 少妇人妻一区二区| heyzo在线欧美播放| 久久草av在线| 亚洲偷欧美偷国内偷| av在线免费观看国产| 国产一区二区三区黄片| 伊人222成人综合网| 久久99久久99| 最近2019年中文视频免费在线观看| 3d动漫一区二区三区| 在线观看视频中文字幕| 黄色网在线看| 激情深爱一区二区| 久久精品久久久久| 日本高清久久久| 麻豆精品永久免费视频| 中文字幕久久精品一区二区| 亚洲日本青草视频在线怡红院| 国产精品久久久久久久久久尿| 亚洲国产精品自拍视频| 天天曰天天操| 99国产精品一区二区| 欧美探花视频资源| 亚洲自拍三区| 国产精品天天操| 亚洲欧洲自拍| 国产清纯在线一区二区www| 国产成人短视频| av免费播放网站| 色资源网站在线观看| 国产日韩欧美一区| 亚洲精品视频免费| 亚洲第一中文av| 国产精品理人伦一区二区三区 | 日韩欧美在线国产| 色综合久久av| 91片黄在线观看喷潮| 蜜桃视频m3u8在线观看| 国产欧美精品日韩区二区麻豆天美| 国产成人久久久| 肉色超薄丝袜脚交69xx图片 | 亚洲制服一区| 欧美区视频在线观看| 国产精品免费看久久久无码| 国内爆初菊对白视频| 色综合视频一区二区三区日韩 | 老头老太做爰xxx视频| 日韩av电影免费| 亚洲一区二区网站| 精品国产欧美成人夜夜嗨| 91视频在线免费| 独立日3在线观看完整版| 亚洲视频高清| 在线观看精品国产视频| 性一交一黄一片| av天天av| 久久亚洲风情| 欧美乱人伦中文字幕在线| 中文字幕人妻一区二区| 在线视频中文字幕久| 麻豆成人久久精品二区三区红| 欧美男插女视频| 人妻精品久久久久中文| 国产系列在线观看| 国产成人综合亚洲网站| 国产成人极品视频| 久久精品国产亚洲av高清色欲| 日本在线免费| 国产亚洲欧美色| 国产乱码精品一区二区三区中文 | 中文乱码字幕高清在线观看| 奇米四色…亚洲| 国产91精品黑色丝袜高跟鞋| 国产十六处破外女视频| av免费在线免费观看| 久久精品视频在线免费观看| 国产精品麻豆免费版| 91禁在线观看| 99久久久成人国产精品| 欧美在线免费视屏| 欧洲av无码放荡人妇网站| 九九热在线观看| 国产日本精品| 97成人在线视频| 五月天婷婷网站| 国产欧美一区二区三区精品酒店| 亚洲一区二区高清| 男人天堂网站在线| 99久久精品一区二区三区| 丁香花在线影院| 中文字幕亚洲不卡| 亚洲美女搞黄| 欧洲vodafonewi精品| 五月天综合网站| 久久久国产精品x99av | 波多野结衣家庭教师视频| 春意影院在线| 久久久一二三| 国产v综合ⅴ日韩v欧美大片| 精品人妻一区二区三区潮喷在线| 久久国产三级| 在线观看91av| 久久久久国产免费| av影片在线看| 亚洲女人的天堂| 欧美中日韩在线| 天天爱天天色| 国产精品一区一区| 国内精品久久国产| 久久久成人影院| 欧美午夜在线视频| 97视频在线观看播放| 五月天婷婷激情| 亚洲综合网站| 亚洲欧美国产高清va在线播| 成人在线手机视频| 中文字幕在线中文字幕在线中三区| 欧美性生活大片免费观看网址| 中文字幕第36页| 真不卡电影网| 中日韩免费视频中文字幕| 福利网在线观看| 奇米影视第四狠狠777| 国产一区在线不卡| 久久久精品国产一区二区三区| 亚洲欧美精品中文第三| 在线视频精品| 亚洲影院色无极综合| 熟妇人妻系列aⅴ无码专区友真希| 欧美丰满日韩| 国模私拍视频一区| 亚洲天堂手机在线| 久久精品国产大片免费观看| 久久免费在线观看| 国产精品乱码一区二区| 欧美激情欧美| 国产成人精品综合久久久| av手机免费看| 66久久国产| 国产精品xxx视频| 国产高潮流白浆喷水视频| 欧美3p视频| 热re91久久精品国99热蜜臀| aaa级黄色片| 国产综合亚洲精品一区二| 国产精品国模在线| 亚洲电影成人成人影院| 性欧美长视频| 国产伦精品一区二区三区| 国产精品白浆流出视频| 精品亚洲国内自在自线福利| 欧美黑人xxxxx| 美女视频a黄免费| 成人黄色777网| 国产亚洲精品久久久久久久| 91福利在线观看视频| 99九九热只有国产精品| 国产精品久久久久99| 亚洲天堂在线视频观看| 日韩av在线播放中文字幕| 国产伦精品一区二区三区免费视频| 久热中文字幕精品视频在线| 国产一区二区在线看| 中日韩在线视频| 米奇.777.com| 亚洲精品成人少妇| 欧美激情第四页| а√天堂8资源在线| 精品欧美一区二区久久| 久久久久99精品成人片毛片| 秋霞蜜臀av久久电影网免费| 亚洲人精品午夜在线观看| 日本视频www| 第一会所sis001亚洲| 国产在线视频91| 五月婷在线视频| 久久国产福利国产秒拍| 可以免费看的黄色网址| 香蕉97视频观看在线观看| 疯狂做受xxxx欧美肥白少妇| 少妇按摩一区二区三区| 精品亚洲二区| 97热精品视频官网| 亚洲国产精品久久卡一| 成人蜜臀av电影| 不要播放器的av网站| 国产一线二线在线观看| 精品视频久久久久久久| 一区二区视频网站| 亚洲综合精品| 在线视频不卡国产| 三区在线视频| 欧美丰满一区二区免费视频| 福利一区二区三区四区| 真实国产乱子伦精品一区二区三区| 国产伦理一区二区三区| 毛片一级免费一级| 色婷婷亚洲综合| 三级av在线免费观看| 日韩电影免费在线观看| 国产极品美女到高潮| 久久国产视频精品| 国产污污在线观看| 欧美性生交大片免费| 蜜桃视频最新网址| 成人黄色小视频| 97人摸人人澡人人人超一碰| 日美av在线| 亚洲午夜久久久久久久久久久 | 香蕉久久免费电影| 久久精品国产一区二区电影| 亚洲va欧美va| 激情文学综合丁香| 国产一区二区三区小说| 欧美男男video| 亚洲精品视频在线播放 | 日日夜夜精品视频免费| 伊人狠狠色丁香综合尤物| 视频国产在线观看| 欧美三级一区二区| 手机在线中文字幕| 日本天堂影院在线视频| 欧美主播一区二区三区| 免费看日韩毛片| 欧美一区影院| 欧美精品中文字幕一区二区| 精品99又大又爽又硬少妇毛片| 欧美精品xxxxbbbb| 国产精品黄色网| 最新日韩欧美| 日韩精品综合在线| 日本乱理伦在线| 亚洲视频在线观看| 一本久道久久综合多人| av不卡在线观看| 亚洲午夜激情影院| 欧美日韩免费电影| 欧美在线视频导航| 岳张嘴把我的精子吞下去| 国产精品欧美一级免费| 九一在线免费观看| 成人中文视频| 另类欧美小说| 免费在线你懂的| 亚洲欧美国产一本综合首页| 午夜精品小视频| 精品中文字幕一区二区| 天天干天天综合| 国产精品毛片无码| 国产乱人伦真实精品视频| 意大利激情丛林无删减版dvd| 欧美日韩一区 二区 三区 久久精品| 日韩高清免费av| 激情五月播播久久久精品| 任你操这里只有精品| 成人美女视频| 青青草一区二区| 天堂影视av| 日韩欧美第一区| 国产jzjzjz丝袜老师水多| 91欧美一区二区| 人妻在线日韩免费视频| 免费一区二区| 中文字幕色一区二区| 国产啊啊啊视频在线观看| 欧美成人黑人xx视频免费观看| 草草视频在线播放| 国产精品污网站| 黑人と日本人の交わりビデオ| 久久亚洲国产| 日韩一二区视频| 日本免费一区二区三区四区| 久久久久在线观看| 国产中文字幕第一页| 日韩一级高清毛片| 亚洲精品一区二区口爆| 最新久久zyz资源站| 欧美一级片在线视频| 一本色道久久综合| 丝袜美腿玉足3d专区一区| www在线免费观看视频| 久久天天躁狠狠躁夜夜爽蜜月| 国产丝袜美女| 日韩欧美国产一区二区| 中文字幕免费高清网站| 91免费观看在线| 69xxx免费| 国产日韩欧美一区在线| 爱豆国产剧免费观看大全剧苏畅| 国产精品毛片av| 免费电影一区| 最新电影电视剧在线观看免费观看| 色综合色综合久久综合频道88| 黄色网页在线| 欧美女孩性生活视频| 成人综合社区| 午夜久久久久久电影| 免费视频久久久| 久久久91精品国产一区二区三区| 国产精品69久久久久孕妇欧美| 亚洲激情专区| 国产精品99精品无码视亚| 日本免费在线视频| 久久综合电影一区| 91大神影片| 日韩精品免费在线| 国产九色视频| 日韩精品一区二区三区视频播放| 一本岛在免费一二三区| 亚洲国产精品影院| 国产按摩一区二区三区| 最新中文字幕一区二区三区| 国产无人区码熟妇毛片多| 国产亚洲精品超碰| 久久久久久久久久99| 国产精品91一区二区| 免费日韩在线视频| 国产成人综合亚洲网站| 国产黄色大片免费看| 国产综合色视频| 亚洲女优在线观看| 丝袜脚交一区二区| 欧美黄色一级生活片| 久久激情婷婷| 少妇一级淫免费观看| 日韩不卡一区二区三区| 五月开心播播网| 媚黑女一区二区| 欧美特黄一区二区三区| 久久一区中文字幕| 中文字幕免费高清视频| 日本人妖一区二区| 中文字幕国产综合| 亚洲综合激情| 久久婷婷五月综合| 久久精品99国产精品日本| 亚洲av无码一区二区三区观看| 亚洲人成毛片在线播放女女| 精品人妻一区二区三区免费| 久久国产一二区| 色欲av无码一区二区三区| 免费亚洲电影在线| 欧美日韩色视频| 成人一级片在线观看| 久久久精品国产sm调教网站| 国产清纯美女被跳蛋高潮一区二区久久w| 亚洲国产综合久久| 久久婷婷国产综合国色天香| 中文字幕91爱爱| 亚洲色图欧洲色图| 伊人久久亚洲综合| 色综合久久综合网欧美综合网 | 亚洲国产精品久久91精品| 蜜桃特黄a∨片免费观看| 少妇激情综合网| 一个人看的免费视频色| 欧美最顶级的aⅴ艳星| 久草免费在线观看| 国产精品一二三视频| 一区二区三区四区日本视频| 蜜桃av噜噜一区二区三区| 婷婷丁香久久| 好色先生视频污| 久久不见久久见国语| 古装做爰无遮挡三级聊斋艳谭| 亚洲理论在线| 日韩人妻无码一区二区三区| 99久久精品国产麻豆演员表| 综合激情网五月| 国产精品私人自拍| 污视频网站免费观看| 9191久久久久久久久久久| 99热免费在线| 欧美大片在线看免费观看| jizz在线观看| 久久久综合亚洲91久久98| 秋霞影院一区| 精品一区二区三区无码视频|