在Keil4.7a編寫了 STM32基於uC/OS-II 、uC/GUI結合使用的一個工程,關鍵代碼如下:
void UI_Display(void)
{
WM_HWIN hWin1,hWin2,hWin3;
unsigned int curs,key,num;
BUTTON_Handle _ahButton[7];
// unsigned char c,d;
// unsigned int temp;
// unsigned long tm;
GUI_CURSOR_Show();//顯示鼠標
WM_SetCreateFlags(WM_CF_MEMDEV); /* Automatically use memory devices on all windows */
// d=1; c=1;
GUI_SetBkColor(GUI_RED); //設置背景色
GUI_SetColor(GUI_WHITE); //設置前景色
GUI_Clear(); //清屏
curs=0x00;
hWin2=FRAMEWIN_Create("當前日期", 0, WM_CF_SHOW, 0, 0,319, 35); //建立FRAME2
FRAMEWIN_SetFont(hWin2, &GUI_FontHZ_FangSong_GB2312_24); //設置字體
hWin3=FRAMEWIN_Create("當前時間",0, WM_CF_SHOW, 53, 100, 266, 35); //建立FRAME3
FRAMEWIN_SetFont(hWin3, &GUI_FontHZ_FangSong_GB2312_24); //設置字體
hWin1=FRAMEWIN_Create("星期",0, WM_CF_SHOW, 0, 100, 52, 35); //建立FRAME1
FRAMEWIN_SetFont(hWin1, &GUI_FontHZ_FangSong_GB2312_24); //設置字體
FRAMEWIN_SetTextAlign(hWin1,GUI_TA_HCENTER); //Frame1 文本中間對齊
FRAMEWIN_SetTextAlign(hWin2,GUI_TA_HCENTER); //Frame2 文本中間對齊
FRAMEWIN_SetTextAlign(hWin3,GUI_TA_HCENTER); //Frame3 文本中間對齊
//建立按鍵F1-F5
_ahButton[0] = BUTTON_Create(0, 200, 64,40, GUI_KEY_F1 , WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV);
_ahButton[1] = BUTTON_Create(64, 200, 64,40, GUI_KEY_F2 , WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV);
_ahButton[2] = BUTTON_Create(128, 200, 64,40, GUI_KEY_F3 , WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV);
_ahButton[3] = BUTTON_Create(192, 200, 64,40, GUI_KEY_F4 , WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV);
_ahButton[4] = BUTTON_Create(256, 200, 64,40, GUI_KEY_F5, WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV);
//按鍵字體設置
BUTTON_SetFont(_ahButton[0],&GUI_FontHZ_FangSong_GB2312_24);
BUTTON_SetFont(_ahButton[1],&GUI_FontHZ_FangSong_GB2312_24);
BUTTON_SetFont(_ahButton[2],&GUI_FontHZ_FangSong_GB2312_24);
BUTTON_SetFont(_ahButton[3],&GUI_FontHZ_FangSong_GB2312_24);
BUTTON_SetFont(_ahButton[4],&GUI_FontHZ_FangSong_GB2312_24);
//按鍵背景色設置
BUTTON_SetBkColor(_ahButton[0],0,GUI_GREEN);
BUTTON_SetBkColor(_ahButton[1],0,GUI_GREEN);
BUTTON_SetBkColor(_ahButton[2],0,GUI_GREEN);
BUTTON_SetBkColor(_ahButton[3],0,GUI_GREEN);
BUTTON_SetBkColor(_ahButton[4],0,GUI_GREEN);
//按鍵前景色設置
BUTTON_SetTextColor(_ahButton[0],0,GUI_WHITE);
BUTTON_SetTextColor(_ahButton[1],0,GUI_WHITE);
BUTTON_SetTextColor(_ahButton[2],0,GUI_WHITE);
BUTTON_SetTextColor(_ahButton[3],0,GUI_WHITE);
BUTTON_SetTextColor(_ahButton[4],0,GUI_WHITE);
num=0;
while(1)
{
WM_ExecIdle(); //刷新屏幕
OSTimeDlyHMSM(0,0,2,0);
}
}
經過任務1調用上面程序,代碼如下
/*********************************************************************************
* 函數名:Task_1
* 描述 : 任務
* 輸入 :*p_arg
* 輸出 : 無
*********************************************************************************/
void Task_1(void *p_arg)
{
(void)p_arg;
while (1)
{
UI_Display();
}
}
編譯,鏈接,下載,發現程序莫名其妙的不能執行,任務不能切換。反覆調試,仿真後發現程序卡死在WM_ExecIdle();
問題關鍵如下:
/************設置棧大小(單位爲 OS_STK )************/
#define TASK_1_STK_SIZE 128
任務1的棧空間太小無法,滿足函數的需要,就發生了卡死。
問題解決辦法如下:
/************設置棧大小(單位爲 OS_STK )************/
#define TASK_1_STK_SIZE 2046 //估計一下任務最多佔用的大小設定