首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

ucos下任务如何判断是否还存活

2013-07-16 
ucos下任务怎么判断是否还存活?如题,建立了多个ucos任务,怎么查看各个任务的当前状态(运行,就绪,挂起等),

ucos下任务怎么判断是否还存活?
如题,建立了多个ucos任务,怎么查看各个任务的当前状态(运行,就绪,挂起等),以及任务是否存活?
我考虑建立一个管理任务,来监视其他用户任务,可是用户任务有阻塞式也有非阻塞式,就不知道怎么设计了?
[解决办法]
如题,建立了多个ucos任务,怎么查看各个任务的当前状态(运行,就绪,挂起等),以及任务是否存活?
在IAR下面,有专门的UCOS的仿真插件,只要在工程设置里加载,就能看到你UCOS里所有元素的信息.

我考虑建立一个管理任务,来监视其他用户任务,可是用户任务有阻塞式也有非阻塞式,就不知道怎么设计了?
纠结的不应该是任务的形式,管理任务的任务主要是对各任务进行管理.加载\运行\删除.
你的任务该怎么跑还怎么跑,不过需要注意的是,像信号量,邮箱这些通信机制的添加\删除一定要小心.
[解决办法]
可以给每一个任务一个全局的枚举状态变量STA[MAX_TASK_CNT],比如任务在等待信号量则把该变量置相应的状态,管理任务中查看对应任务的STA就知道此任务在干什么
[解决办法]
查询任务名称 优先级 运行状态 堆栈情况!
这个我做过,直接给你代码吧。
{
u8 i = 0;
sprintf(sMsg+strlen(sMsg),"任务名优先级运行状态堆栈情况(字节)\r\n");
for(i = 0;i<OS_LOWEST_PRIO+1;i++)
{

u8 err = 0,TaskState = 0;
OS_TCB tempOsTcb;
OS_STK_DATA tempSTKData;
u32 nTotalSTK;
err = OSTaskQuery(i,&tempOsTcb);
if(err != OS_ERR_NONE)
continue;
if(strlen(tempOsTcb.OSTCBTaskName) >= 8)
{
sprintf(sMsg+strlen(sMsg),"%s\t%d\t",tempOsTcb.OSTCBTaskName,i);
}
else
{
sprintf(sMsg+strlen(sMsg),"%s\t\t%d\t",tempOsTcb.OSTCBTaskName,i);
}
TaskState = tempOsTcb.OSTCBStat;
switch(TaskState)
{
case OS_STAT_RDY:
strcat(sMsg,"就绪\t");
break;
case OS_STAT_SEM:
strcat(sMsg,"等待信号量");
break;
case OS_STAT_MBOX:
strcat(sMsg,"等待邮箱");
break;
case OS_STAT_Q:
strcat(sMsg,"等待队列");
break;
case OS_STAT_SUSPEND:
strcat(sMsg,"挂起\t");
break;
case OS_STAT_MUTEX:
strcat(sMsg,"互斥量\t");
break;
case OS_STAT_FLAG:
strcat(sMsg,"等待事件标志");
break;
case OS_STAT_MULTI:
strcat(sMsg,"等待多个事件");
break;
default:
sprintf(sMsg+strlen(sMsg),"错误状态:%d",TaskState);
break;
}
strcat(sMsg,"\t");

err = OSTaskStkChk(i,&tempSTKData);
if(err != OS_ERR_NONE)
{
strcat(sMsg,"堆栈错误\r\n");


continue;
}
nTotalSTK = tempSTKData.OSUsed + tempSTKData.OSFree;
sprintf(sMsg+strlen(sMsg),"%d/%d\r\n",tempSTKData.OSUsed,nTotalSTK);

}
}

热点排行