在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 //估计一下任务最多占用的大小设定