最新教程下載:http://www.armbbs.cn/forum.php?mod=viewthread&tid=98429php
本章節爲你們講解GUIX定時器更新功能。這個功能用的到地方不少,好比更新文本控件顯示RTC時鐘,採集數據的動態更新等場合都要用到。框架
15.1初學者重要提示函數
15.2 GUIX Studio設置窗口事件回調學習
15.3 GUIX定時器更新功能ui
15.4 實驗例程設計框架spa
15.5實驗例程設計
15.6 總結指針
GUIX Studio的設置方法與第11章同樣,咱們這裏把控件的位置和大小作了調整,併爲window窗口建立一個定時器。調試
新調整的界面效果以下:code
下面咱們爲窗口控件設置一個Event Function,此功能是窗口的事件回調函數。在這個回調函數裏面,你們能夠處理各類事件。
這裏爲Event Function設置的回調函數名爲_cbEventWindow0,而後就可使用GUIX Studio生成新的代碼。生成的代碼移植到硬件平臺的方法看第12章便可。
使用控件prompt作更新,必定要在GUIX Studio上勾選Private Text Copy,不然prompt的內容是沒法更新的:
在GUIX Studio上設置好事件回調函數名後,剩下就是在程序裏面實現定時器事件回調的處理,這裏把實現方法爲你們作個說明。
GUIX定時器相關的幾個宏定義以下:
#ifndef GX_TICKS_SECOND #define GX_TICKS_SECOND 20 #endif /* Set default ThreadX timer tick frequency 100Hz (10ms timer). */ #ifndef TX_TIMER_TICKS_PER_SECOND #define TX_TIMER_TICKS_PER_SECOND ((ULONG)100) #endif /* Default 20ms GUIX system timer. */ #ifndef GX_SYSTEM_TIMER_MS #define GX_SYSTEM_TIMER_MS 20 #endif /* Derive GX_SYSTEM_TIMER_TICKS based on GX_SYSTEM_TIMER_MS value. */ #ifndef GX_SYSTEM_TIMER_TICKS #define GX_SYSTEM_TIMER_TICKS ((GX_SYSTEM_TIMER_MS * TX_TIMER_TICKS_PER_SECOND) / 1000) #endif
以本教程配置的例子爲例,僅用到定義GX_SYSTEM_TIMER_TICKS,其它基本都沒用到。這個宏定義被ThreadX內核定時器組件的建立函數所調用,以此來供GUIX的定時器組件使用:
tx_timer_create(&_gx_system_timer, "guix timer", _gx_system_timer_expiration, 0, GX_SYSTEM_TIMER_TICKS, GX_SYSTEM_TIMER_TICKS, TX_NO_ACTIVATE);
通常咱們都設置ThreadX內核系統時鐘節拍爲1000Hz,即1ms。所以這裏設置GX_SYSTEM_TIMER_TICKS表示GUIX定時器的週期單位是GX_SYSTEM_TIMER_TICKS毫秒。好比GX_SYSTEM_TIMER_TICKS定義爲2,表示GUIX的定時器單位是2ms。
咱們主要用到函數gx_system_timer_start,用於啓動定時器。函數原型以下:
#define gx_system_timer_start(a, b, c, d) _gx_system_timer_start((GX_WIDGET *)a, b, c, d) UINT _gx_system_timer_start(GX_WIDGET *owner, UINT timer_id, UINT initial_ticks, UINT reschedule_ticks)
函數形參含義以下:
控件指針變量,指向控件控制塊,表示爲那個控件建立定時器。
定時器ID。
初始溢出時間,單位由宏定義GX_SYSTEM_TIMER_TICKS決定。
參數範圍1到0xFFFFFFFF。
週期性執行時間,單位由宏定義GX_SYSTEM_TIMER_TICKS決定。
參數範圍1到0xFFFFFFFF。
注意事項:
GUIX的定時器調用是在窗口(控件)的事件回調函數裏面調用的。以窗口爲例,窗口的Event Function事件回調函數實現框架以下:
UINT _cbEventWindow(GX_WINDOW *widget, GX_EVENT *event_ptr) { switch (event_ptr->gx_event_type) { /* 控件顯示事件 */ case GX_EVENT_SHOW: break; /* 定時器時間溢出事件*/ case GX_EVENT_TIMER: break; default: return gx_window_event_process(widget, event_ptr); } return 0; }
事件回調函數還有不少其它事件供用戶使用,這裏僅列出了定時器用到的兩個。這個框架基本是固定的,你們直接調用便可,下面舉一個實例來講明定時器的使用。
實例代碼以下,本章教程配套例子也是用的這個代碼:
/* ********************************************************************************************************* * 函 數 名: _cbEventWindow * 功能說明: 窗口window的事件回調函數 * 形 參: widget 窗口句柄 * event_ptr 事件指針 * 返 回 值: 返回0表示成功 ********************************************************************************************************* */ UINT _cbEventWindow(GX_WINDOW *widget, GX_EVENT *event_ptr) { static uint32_t count = 0; char buf[20] = {0}; switch (event_ptr->gx_event_type) { /* 控件顯示事件 */ case GX_EVENT_SHOW: /* 啓動一個GUIX定時器 */ gx_system_timer_start((GX_WIDGET *)widget, GUI_ID_Timer0, 1, 50); /* 默認事件處理 */ gx_window_event_process(widget, event_ptr); break; /* 定時器時間溢出事件*/ case GX_EVENT_TIMER: if (event_ptr->gx_event_payload.gx_event_timer_id == GUI_ID_Timer0) { sprintf(buf, "%d", count++); gx_prompt_text_set((GX_PROMPT *)&(window.window_prompt), buf); } break; default: return gx_window_event_process(widget, event_ptr); } return 0; }
窗口(控件)顯示事件。當窗口(控件)顯示時,會產生此消息,既能夠附加到一個可見窗口(控件),也能夠經過函數gx_widget_show()。窗口(控件)繪製前會產生此消息。
啓動定時器。
用於窗口(控件)的默認事件處理。
定時器週期性溢出事件
設置文本控件prompt的內容。
針對這個實例,推薦你們設置不一樣的參數看效果,熟練掌握這些函數的用法,這樣用起GUIX也駕輕就熟。
本章例程的重點是GUIX定時器更新的實現,任務中專門爲窗口設置了一個Event Function事件回調函數。
(注,若是是電阻屏,須要作觸摸校準,校準方法看本教程附件章節A)
配套例子:
本章節配套了以下兩個例子供你們移植參考:
GUIX Studio生成的代碼在硬件平臺實際運行的工程,含有GCC,IAR,MDK AC5和AC6四個版本工程。
GUIX Studio工程模板,設計界面後,生成的文件可直接添加到MDK,IAR和GCC軟件平臺使用。
實驗目的:
實驗內容:
App Task Start任務 :啓動任務,這裏用做BSP驅動包處理。
App Task MspPro任務 :消息處理,這裏用做LED閃爍。
App Task UserIF任務 :按鍵消息處理。
App Task GUI任務 :GUI應用任務。
App Task STAT任務 :統計任務。
App Task IDLE任務 :空閒任務。
GUIX System Thread :GUI系統任務。
System Timer Thread任務:系統定時器任務。
實驗效果:
GUIX Studio的界面設計以下:
串口打印任務執行狀況:
IAR,MDK AC5和AC6工程能夠串口打印任務執行狀況:按開發板的按鍵K1能夠打印,波特率 115200,數據位 8,奇偶校驗位無,中止位 1:
Embedded Studio(GCC)平臺的串口打印是經過其調試組件SEGGER RTT作的串口打印,速度也很是快,打印效果以下:
展現裏面有亂碼是由於Embedded Studio不支持中文。
本章節主要爲你們講解了GUIX定時器更新功能,推薦你們設置不一樣的參數看效果,熟練掌握這些函數的用法。