ucos 任务延时函数

在ucos里,系统也提供了这样的延时函数,一个是大众版本OSTimeDly(),一个是精致版本的OSTimeDlyHMSM(),随你怎么选择

这两者的区别就是,OSTimeDly的延时时间是以节拍数来衡量的额,OSTimeDlyHMSM的延迟时间则使以具体时间大小来很亮的。


这两个函数有着非常重要的作用,就是当你调用这两个函数的时候,ucos会进行一次任务调度,所以CPU能在各任务间进行切换,很有大功劳得以这两个函数

 调用这两个函数都会挂起本任务,CPU就会执行就绪表优先级最高的任务。

   有一点要注意的是任务调用OSTimeDly()后,一旦规定的时间期满或者有其它的任务通过OSTimeDlyResume()取消了延迟,它就会马上进入就绪态,

而不是执行状态,也就是说延时结束后本任务一定不会被立刻执行

  void  OSTimeDly(INT16U ticks)

{

   if(ticks>0)

  {

        OS_ENTER_CRITICAL();            (1)

       if((OSRdyTbl[OSTCBCur->OSTCBy]&=~OSTCBCur->OSTCBBitx)==0)    (2)

      {

OSRdyGrp&=~OSTCBCur->OSTCBBitY;

       }

       OSTCBCur->OSTCBDly=ticks;

      OS_EXIT_CRITICAL();

      OSSched();

  }

}

其实程序就做不下面几件事

1.把任务从任务就绪表中删除

2.把延时值保持到任务控制块中,并且通过OSTimeTick()每隔一个是在节拍就减少一个延时节拍数

3.调用任务调度函数,切换任务。


INT8U OSTimeDlyHMSM(INT8U hours,INT8U minutes,INT8U seconds,INT16U Milli)

{

    INT32U ticks;

    INT16U loops;

   if(hours>0||minutes>0||seconds>0||milli>0)

   {

if(minutes>59)

           return OS_TIME_INVALID_MINUTES;

      if(seconds>59)

          return OS_TIME_INVALID_SECONDS;

     if(milli>999)

        return (OS_TIME_INVALID_MILLI);


     ticks=(INT32U)hours*3600*OS_TICKS_PER_SEC+minutes*60*OS_TICKS_PER_SEC+seconds*OS_TICKS_PER_SEC

                             +OS_TICKS_PER_SEC*milli+500/OS_TICKS_PER_SEC/1000

        loops=ticks/65536 ;ticks=ticks%65536

       OSTimeDly(ticks)

        while(loops>0)

       {

   OSTimeDly(32768);

            OSTimeDly(32768);

           loops-;

       }

    }

    else

     {

return(OS_TIME_ZERO_DLY);

    }


}



  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值