ucos下任务怎么判断是否还存活?

celerylxq 2013-04-23 11:37:09
如题,建立了多个ucos任务,怎么查看各个任务的当前状态(运行,就绪,挂起等),以及任务是否存活?
我考虑建立一个管理任务,来监视其他用户任务,可是用户任务有阻塞式也有非阻塞式,就不知道怎么设计了?
...全文
693 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
further_away 2013-05-25
  • 打赏
  • 举报
回复
查询任务名称 优先级 运行状态 堆栈情况! 这个我做过,直接给你代码吧。 { 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); } }
celerylxq 2013-05-22
  • 打赏
  • 举报
回复
引用 6 楼 lbing7 的回复:
[quote=引用 5 楼 celerylxq 的回复:] [quote=引用 1 楼 lbing7 的回复:] 如题,建立了多个ucos任务,怎么查看各个任务的当前状态(运行,就绪,挂起等),以及任务是否存活? 在IAR下面,有专门的UCOS的仿真插件,只要在工程设置里加载,就能看到你UCOS里所有元素的信息. 我考虑建立一个管理任务,来监视其他用户任务,可是用户任务有阻塞式也有非阻塞式,就不知道怎么设计了? 纠结的不应该是任务的形式,管理任务的任务主要是对各任务进行管理.加载\运行\删除. 你的任务该怎么跑还怎么跑,不过需要注意的是,像信号量,邮箱这些通信机制的添加\删除一定要小心.
我想建立一个管理任务的目的是判断用户任务是不是跑死了,如果用户任务是非阻塞,我可以让这些用户任务定时给管理任务发消息,可是阻塞任务没法定时发消息,就不知道怎么判断它是不是死了。[/quote] 要不试着把阻塞的变成非阻塞的 这样你看行不行,在阻塞等待一个系统机制的时候,用一定的时间阻塞代替永远阻塞 当时间溢出的时候,取等待的状态,这样以得到该阻塞退出是时间溢出还是得到相应的权限 如果是溢出,则做相应的记数或者其它的防止死等的处理 另外我说的那个取系统任务状态是指有一个函数可以取得指定任务的TCB,这样的话,可以根据这个来判断该任务是否长时间挂起[/quote] 多谢,我找找那个查TCB的函数。
lbing7 2013-05-22
  • 打赏
  • 举报
回复
引用 5 楼 celerylxq 的回复:
[quote=引用 1 楼 lbing7 的回复:] 如题,建立了多个ucos任务,怎么查看各个任务的当前状态(运行,就绪,挂起等),以及任务是否存活? 在IAR下面,有专门的UCOS的仿真插件,只要在工程设置里加载,就能看到你UCOS里所有元素的信息. 我考虑建立一个管理任务,来监视其他用户任务,可是用户任务有阻塞式也有非阻塞式,就不知道怎么设计了? 纠结的不应该是任务的形式,管理任务的任务主要是对各任务进行管理.加载\运行\删除. 你的任务该怎么跑还怎么跑,不过需要注意的是,像信号量,邮箱这些通信机制的添加\删除一定要小心.
我想建立一个管理任务的目的是判断用户任务是不是跑死了,如果用户任务是非阻塞,我可以让这些用户任务定时给管理任务发消息,可是阻塞任务没法定时发消息,就不知道怎么判断它是不是死了。[/quote] 要不试着把阻塞的变成非阻塞的 这样你看行不行,在阻塞等待一个系统机制的时候,用一定的时间阻塞代替永远阻塞 当时间溢出的时候,取等待的状态,这样以得到该阻塞退出是时间溢出还是得到相应的权限 如果是溢出,则做相应的记数或者其它的防止死等的处理 另外我说的那个取系统任务状态是指有一个函数可以取得指定任务的TCB,这样的话,可以根据这个来判断该任务是否长时间挂起
celerylxq 2013-05-22
  • 打赏
  • 举报
回复
引用 1 楼 lbing7 的回复:
如题,建立了多个ucos任务,怎么查看各个任务的当前状态(运行,就绪,挂起等),以及任务是否存活? 在IAR下面,有专门的UCOS的仿真插件,只要在工程设置里加载,就能看到你UCOS里所有元素的信息. 我考虑建立一个管理任务,来监视其他用户任务,可是用户任务有阻塞式也有非阻塞式,就不知道怎么设计了? 纠结的不应该是任务的形式,管理任务的任务主要是对各任务进行管理.加载\运行\删除. 你的任务该怎么跑还怎么跑,不过需要注意的是,像信号量,邮箱这些通信机制的添加\删除一定要小心.
我想建立一个管理任务的目的是判断用户任务是不是跑死了,如果用户任务是非阻塞,我可以让这些用户任务定时给管理任务发消息,可是阻塞任务没法定时发消息,就不知道怎么判断它是不是死了。
celerylxq 2013-05-22
  • 打赏
  • 举报
回复
引用 3 楼 lbing7 的回复:
对了,想起来补充一个 UCOS有访问任务属性的接口,里面可以知道任务状态...
多谢版主,这天天出差的都不能上网。。。 不知道你说的ucos访问任务属性的接口是指什么? 此外我使用OSTaskStkCh查看用户任务的pdata.OSFree和pdata.OSUsed,都为0,可是系统任务的free空间却能看到。
lbing7 2013-04-26
  • 打赏
  • 举报
回复
对了,想起来补充一个 UCOS有访问任务属性的接口,里面可以知道任务状态...
dceacho 2013-04-24
  • 打赏
  • 举报
回复
可以给每一个任务一个全局的枚举状态变量STA[MAX_TASK_CNT],比如任务在等待信号量则把该变量置相应的状态,管理任务中查看对应任务的STA就知道此任务在干什么
lbing7 2013-04-24
  • 打赏
  • 举报
回复
如题,建立了多个ucos任务,怎么查看各个任务的当前状态(运行,就绪,挂起等),以及任务是否存活? 在IAR下面,有专门的UCOS的仿真插件,只要在工程设置里加载,就能看到你UCOS里所有元素的信息. 我考虑建立一个管理任务,来监视其他用户任务,可是用户任务有阻塞式也有非阻塞式,就不知道怎么设计了? 纠结的不应该是任务的形式,管理任务的任务主要是对各任务进行管理.加载\运行\删除. 你的任务该怎么跑还怎么跑,不过需要注意的是,像信号量,邮箱这些通信机制的添加\删除一定要小心.

27,370

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧