(UCOS)OSTaskSuspend挂起任务

任务在创建后将从睡眠态转换到就绪态,就绪的任务如果调用OSTaskSuspend将被阻塞,也就是被剥夺CPU的使用权而暂时中止运行,转到阻塞状态。通过OSTaskSuspend将任务转到阻塞态被称为挂起任务。
被挂起的任务不能运行,知道其他任务以该任务的优先级作为参数调用OSTaskResume来恢复它,才能将该任务的状态重新设置为就绪状态。当该任务是就绪的最高优先级的任务时,又可以得到调度而重新占领CPU,回到运行态。
一个任务如果无事可做,且优先级又较高,长期占有CPU,那么其他的任务将得不到运行而“饿死”。因此,任务在不需要运行的时候应该放弃CPU,挂起就是其中的一种策略,除此之外还有任务延时等策略。

 
由上图可知,在运行过程的任务因为调用OSTaskSuspend而被挂起到阻塞态。阻塞态的任务因为其他任务以该任务的优先级作为参数调用OSTaskResume而得到恢复,恢复到就绪态。就绪的任务在优先级变为最高的情况下最终得到了运行。
值得注意的是,挂起一个任务并非将其转换挂起态,而是阻塞态。任务因为中断失去CPU控制权才会转换为挂起态,挂起态的任务在中断结束后直接回到运行态。这两者是有明显的区别的。
函数OSTaskSuspend用来暂时停止一个任务的执行,将任务转换为阻塞态。如果传递给OSTaskSuspend的参数是OS_PRIO_SELF,则将阻塞自己,如果prio是其他任务的优先级,则将阻塞其他的就绪任务。
根据该函数执行过程中的各种情况,返回值包括:
(^_^) OS_ERR_NONE:如果成功挂起一个任务
(^_^) OS_ERR_TASK_SUSPEND_IDLE:如果试图阻塞空闲任务。
(^_^) OS_ERR_PRIO_INVALID:非法的优先级
(^_^) OS_ERR_TASK_SUSPEND_PRIO:要挂起的任务不存在
(^_^) OS_ERR_TASK_NOT_EXITS:要挂起使用互斥信号量的任务。 
另外有一点需要特别注意的是,如果挂起了一个任务,那么要注意这个任务是否在等待某些事件的发生,需要防止在事件发生的时候阻塞了的任务因为事件的发生而运行。
OSTaskSuspend代码如下所示:

 
取消就绪表和就绪组中的就绪标志后,被挂起的任务在将来如果没有恢复,就不能获得CPU的使用权,因此处于阻塞状态。如果任务是自己挂起自己,实际上这时任务还是在运行的,要等到倒数第二行代码任务调度的时候,失去CPU。

 
其中OS_STAT_SUSPEND的值是0x08,即二进制的00001000,也就是说,OSTCBStat的从低到高的第4位标志着任务是否被挂起。
换句话说,当OSTCBStat的第4位是1时,标志着任务被挂起,否则任务没有被使用OSTaskSuspend挂起到阻塞态。 
函数OSTaskSuspend用来暂时停止一个任务的执行,将任务状态转换为阻塞态。那么处于阻塞态的任务要想得到运行,必须先恢复到就绪态。这个恢复被挂起的任务的函数就是OSTaskResume,它和OSTaskSuspend正好是一对函数。
在OSTaskSuspend挂起一个任务的时候,要修改就绪表和就绪组,取消任务的就绪标志;那么恢复一个任务的时候,应该加上就绪标志。另外,对于挂起的标志,是在任务控制块中的OSTCBStat从低到高的第4位,因此,如果恢复一个任务,应该看这一位是否已经被置位,如果没有被置位,那么恢复操作也应该是无效的。最后,如果一切正常,再将该位进行复位。
OSTaskResume代码如下所示:

 
 

if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) != OS_STAT_RDY)  判断要恢复的任务是否为被OSTaskSuspend挂起。当然,如果对应优先级的任务并没有被OSTaskSuspend挂起,就谈不上使用OSTaskResume恢复。将要恢复的任务称为目标任务,目标任务的控制块称为目标TCB,那么,前面将目标任务的TCB的地址已经赋给了ptcb,目标TCB的OSTCBStat从低到高的第4位标志着任务是否被挂起。而宏OS_STAT_SUSPEND就是二进制的00001000,因此ptcb->OSTCBStat&OS_STAT_SUSPEND刚好是屏蔽了OSTCBStat中的所有其他的位,因为&是按位与,只留下了第4位。OS_STAT_RDY的值是0,所以ptcb->OSTCBStat&OS_STAT_SUSPEND的结果不等于0就说明了确实是被OSTaskSuspend挂起的任务。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值