在STM32上移植ucGUI之WM_REDRAW.c源碼分析
一、wm_redraw.c移植
我在上一篇筆記中講過如何將ucGUI移植到STM32上開發(fā)裸機(jī)程序。在本篇筆記中分析一下wm_redraw.c的移植及源碼。首先打開移植好的ucGUI工程文件,然后將ucGUISampleGUI目錄下WM_Redraw.c文件中的函數(shù)拷貝到工程中main.c文件中。添加頭文件包含預(yù)處理命令include“gui.h”和#include "wm.h"(μC/GUI的視窗管理器是一個獨(dú)立的(可選的)的軟件項(xiàng)目,它沒有包括進(jìn)μC/GUI基本的軟件包里),然后在主函數(shù)中添加如下語句:
編譯通過之后下載進(jìn)開發(fā)板觀察發(fā)現(xiàn)畫面是靜止不動的。通過單步跟蹤發(fā)現(xiàn)程序停在了GUI_Delay()函數(shù)中。
該函數(shù)原型如下所示:
由以上代碼可以看出,在沒有加入實(shí)時(shí)操作系統(tǒng)時(shí),GUI_GetTime()函數(shù)無法獲取實(shí)時(shí)的時(shí)間值,從而產(chǎn)生了
死循環(huán)。而GUI_delay函數(shù)真正有價(jià)值的語句就是GUI_Exec,而后面確保了5ms的用于刷新界面的延時(shí)。所以
在裸機(jī)情況下,可以將該函數(shù)修改為如下所示的形式:
修改完之后重新編譯在開發(fā)板上運(yùn)行,就可以看到動態(tài)的窗口移動的效果了。
二、示例源碼分析
程序執(zhí)行時(shí),首先進(jìn)入的函數(shù)是_DemoReraw(),如下為主循環(huán)中的內(nèi)容。
① 通過調(diào)用_MoveWindow函數(shù)移動窗口,此時(shí)并沒有設(shè)置和調(diào)用回調(diào)函數(shù)。窗口僅僅是單純的以矢量(2,2
) 進(jìn)行移動。所以我們會看到窗口移動的一層層被覆蓋的痕跡。
② 移動完成之后 調(diào)用GUI_ClearRect()函數(shù)清除移動的痕跡和原來的窗口。GUI_函數(shù)的作用是使用背景顏
色填充一個矩形區(qū)域。
③ 設(shè)置背景區(qū)域的回調(diào)函數(shù), 并移動窗口。此時(shí)發(fā)現(xiàn)窗口移動的很干凈,沒有拖拽的痕跡。此時(shí),在回調(diào)
函數(shù)中添加串口調(diào)試信息如下,然后分別注釋掉兩次移動的過程??梢园l(fā)現(xiàn)第一次回調(diào)函數(shù)確實(shí)沒有被調(diào)用
,而第二次確可以收到調(diào)試信息。
④ 失能回調(diào)函數(shù)。在此處失能回調(diào)函數(shù),以使得下次循環(huán)開始的時(shí)候窗口有移動的痕跡。
有關(guān)回調(diào)函數(shù)及相關(guān)函數(shù)的使用請閱讀《uc/GUI手冊》。