ucos恢复任务

 一个任务被挂起之后,想要再次被执行,是需要恢复,恢复任务需调用

OSTaskResume()函数实现,想OSTaskSuspend()一样,调用OSTaskResume()需要一个参数,就是优先级,如果OSTaskResume(5)就是恢复优先级5的

任务

INT8U OSTaskResume(INT8U prio)

{

    OS_TCB *ptcb;

   if(prio>=OS_LOWEST_PRIO)

     return (OS_PRIO_INVALID);

   else

  {

      if(ptcb->OSTCBStat&OS_STAT_SUSPEND)

    {

        if((ptcb->OSTCBStat&=~OS_STAT_SUSPEDN)==OS_STAT_RDY&&(PTCB->OSTCBDly==0))  (4)

       {

           OSRdyGrp |=ptcb->OSTCBBitY;

           OSRdyTbl[ptcb->OSTCBY]|=ptcb->OSTCBBitX;

            OS_EXIT_CRITICAL();

            OSSched();

       }

        else

        {

               OS_EXIT_CRITICAL();

          }

  }

  else

{

       OS_EXIT_CRITICAL();

          return(OS_TASK_NOT_SUSPENDED);

  }

  }

 

任务恢复的实现基本上任务挂起的反向操作

因为OSTaskSuspend()不挂起空闲任务,所以必须得确认用户的应用程序不是在恢复空闲任务(1),注意,这个测试页可以确保用户不是在恢复优先级为

OS_PRIO_SELF的任务(OS_PRIO_SELF被定义为0xff,它总是比OS_LOWEST_PRIO大),

要恢复的任务必须存在,因为用户要需要操作它的任务控制块,OS_TCB(2),并且该任务必须是被挂起的(3);OSTaskResume()通过清除OSTCBStat域

中的OS_STAT_SUSPENDED位来取消挂起的(4),要使任务处于就绪状态,OS_TCBDly域必须为0(5);这是因为在OSTCBStat中没有任何标志表明任务正在等待延时的期满

,只有当以上两个条件满足的时候,任务处于就绪状态(6);最后,任务调度程序会检查被恢复的任务拥有的优先级是否比调用本函数的任务的优先级高(7).

其中最重要的这两句程序:

 OSRdyGrp |=ptcg->OSTCBBitY;

OSRdyTbl[ptcb->OSTCBY]|=ptcb->OSTCBBitX;

程序的作用就是把任务重新添加就绪表。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值