1.长时间使用可能死机,怎么解决?
[mw_shl_code=c,true]int GUI_X_GetTime(void) {
return ((int)OSTimeGet()); //获取系统时间,此处时间单元为1ms
}[/mw_shl_code]
这是emwin的时间获取函数,最大为2147483647ms,即24.85天。也就是要是设备连续运行这么多天的话,计数器到达最大值,此时就有可能出现问题。
于是我就做了个测试,将ucos中的OSTime类型改为u16,即溢出频率为65.5s。
[mw_shl_code=c,true]OS_EXT volatile INT32U OSTime; [/mw_shl_code]
测试中发现,在使用了GUI_Delay函数的任务中,过了65秒,该任务就死了,我猜想是由于OSTime溢出导致GUI获取时间出了问题,导致长时间等待,出现假死的现象。这该怎么破?我有项目需设备长期连续运行,使用EMWIN+UCOS,是不能死机的。我尝试过各种方法,还是没能避免这种现象。
2.多个任务下使用EMWIN,出现字体,颜色的意外改变。
[mw_shl_code=c,true]void emwin_task(void *pdata) //优先级为3
{
pdata = pdata;
GUI_CURSOR_Show(); //显示鼠标
numdisplay_demo(0,50);
GUI_SetBkColor(GUI_BLUE); //设置蓝色背景
GUI_SetColor(GUI_WHITE); //设置字体颜色为白色
GUI_SetFont(&GUI_Font8x16); //设置字体
GUI_SetTextMode(GUI_TM_TRANS); //透明模式
GUI_DispStringAt("CPUUsage: %",60,200);
GUI_DispStringAt("times:0000",84,216);
GUI_SetColor(GUI_RED); //设置字体颜色为红色
GUI_FillRect(100,232,140,257);
GUI_SetTextMode(GUI_TM_NORMAL); //正常模式
while(1)
{
LED1 = !LED1;
GUI_DispDecAt(OSCPUUsage,132,200,3);
GUI_Delay(250);
}
}
//LED0任务
void led0_task(void *pdata) //优先级为1
{
u16 t=0;
pdata = pdata;
while(1)
{
LED0 = !LED0;
GUI_DispDecAt(t,200,200,3);
t++;
OSTimeDlyHMSM(0,0,0,500);//延时500ms
}
}[/mw_shl_code]
代码如上所示,测试结果发现上面那个任务以红色,8*16号字体显示;但是下面那个任务却是以黑底白字,6*8字体显示(好像是系统默认字体)。
当我交换两个任务的优先级时,发现两个任务均以以黑底白字,6*8字体显示。这是为什么?我在任务emwin_task中已经进行了相关的设置,按理说以最后的为准,无论优先级是什么情况,稳定状态下两个任务就应该都是蓝底红字,8*16号字体显示的。
麻烦大家帮我看看这是什么情况,谢谢了! |