板子为探索者F407,在TCP Client的例程上想添加一个monitor task监控其他task状态,monitor task优先级为6,高于TCP,LEDtask。
monitor task函数代码如下。但我不想monitor task刷新太快,所以在循环中添加一个延时500ms。但经过测试发现一加延时程序就挂了,而且网络也ping不同服务器。
哪位大神指点指点?
void monitor_task(void *pdata)
{
u8 i = 0;
u8 j = 0;
char sMsg[300];
printf("Enter monitor Task, the size of sMsg = %d
", sizeof(sMsg));
while(1)
{
printf("j = %d
", j++);
sprintf(sMsg + strlen(sMsg), "TaskName TaskPriority State Stack(Byte)
");
for(i = 6; i < 10; i++)
{
u8 err = 0;
u8 TaskState = 0;
OS_TCB tempOsTcp;
OS_STK_DATA tempSTKData;
u32 nTotalSTK;
err = OSTaskQuery(i, &tempOsTcp);
if (err != OS_ERR_NONE)
{
delay_ms(50);
continue;
}
if(strlen(tempOsTcp.OSTCBTaskName) >= 8)
sprintf(sMsg + strlen(sMsg), "%s %d ", tempOsTcp.OSTCBTaskName, i);
else
sprintf(sMsg + strlen(sMsg), "%s %d ", tempOsTcp.OSTCBTaskName, i);
TaskState = tempOsTcp.OSTCBStat;
switch(TaskState)
{
case OS_STAT_RDY:
strcat(sMsg, "Ready ");
break;
case OS_STAT_MBOX:
strcat(sMsg, "WaitMailBox");
break;
case OS_STAT_SEM:
strcat(sMsg, "WaitSemaphore");
break;
case OS_STAT_SUSPEND:
strcat(sMsg, "Suspend ");
break;
case OS_STAT_MUTEX:
strcat(sMsg, "MutexSemaphore");
break;
case OS_STAT_FLAG:
strcat(sMsg, "WaitEventFlag");
break;
case OS_STAT_MULTI:
strcat(sMsg, "WaitMultiEvent");
break;
default:
sprintf(sMsg + strlen(sMsg), "ErrorState: %d", TaskState);
// reCreate_task(LED_TASK_PRIO);
break;
}
strcat(sMsg, " ");
err = OSTaskStkChk(i, &tempSTKData);
if(err != OS_ERR_NONE)
{
strcat(sMsg, "StackError
");
continue;
}
nTotalSTK = tempSTKData.OSUsed + tempSTKData.OSFree;
sprintf(sMsg + strlen(sMsg), "%d %d
", tempSTKData.OSUsed, nTotalSTK);
}
printf("%s
", sMsg);
memset(sMsg, 0, sizeof(sMsg));
//delay_ms(500);
OSTimeDlyHMSM(0,0,0, 200);
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
这不是有延时吗,为什么还要加延时,何况用的还是delay_ms这种。
看来楼主都ucos操作系统知识了解不深。
就是加了这个延时OSTimeDlyHMSM(0,0,0, 200);就会出问题。 刚接触UCOS,还请见谅。
按我的理解,每一个task应该都要delay一下让其他的task有机会去获取CPU占用权吧。
而且我也不想让monitor task太频繁的刷新。最好是500毫秒刷新一次。
能不能指点指点?不知道是什么原因
一周热门 更多>