uCOS-II任务延时函数

uCOS-II任务延时函数
编写过单片机程序的都知道,延时函数是经常被用到的。
在uCOS-II里,系统也提供了这样的延时函数。一个是大众版的OSTimeDly(),一个是精致版的OSTimeDlyHMSM()。 萝卜青菜,各有所爱,随你怎么选。
这两者的区别是,OSTimeDly()的延时时间是以节拍数来衡量的,OSTimeDlyHMSM()的延时时间则是以具体时间大小来衡量的。
这两个函数有着非常重要重要的作用,就是当你调用这两个函数的时候,ucos II 会进行一次任务调度。所以cpu能在各任务间进行切换,很大功劳得益于这两个函数。
调用这两个延时函数都会挂起本任务,CPU就会执行就绪表中优先级最高的任务。
有一点要注意的是任务调用OSTimeDly()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时,它就会马上进入就绪状态,而不是执行状态,也就是说延时结束后本任务不一定会被立刻执行。
下面看看这两个函数的具体实现。
 OSTimeDly()函数实现过程如下:
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. Void OSTimeDly (INT16U ticks)  
  2. {  
  3.     if (ticks > 0) {                                                         //(1)  
  4.         OS_ENTER_CRITICAL();  
  5.         if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {     //(2)  
  6.             OSRdyGrp &= ~OSTCBCur->OSTCBBitY;  
  7.         }  
  8.         OSTCBCur->OSTCBDly = ticks;                                          //(3)  
  9.         OS_EXIT_CRITICAL();  
  10.         OSSched();                                                           //(4)  
  11.     }  
  12. }  
其实程序就做了下面几件事
1、把本任务从任务就绪表中删除
2、把延时值保持到任务控制块中,并且通过OSTimeTick()每隔一个时钟节拍就减少一个延时节拍数

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


OSTimeDlyHMSM()函数实现过程如下:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli)  
  2. {  
  3.     INT32U ticks;  
  4.     INT16U loops;  
  5.    
  6.    
  7.     if (hours > 0 || minutes > 0 || seconds > 0 || milli > 0) {          //(1)  
  8.         if (minutes > 59) {  
  9.             return (OS_TIME_INVALID_MINUTES);  
  10.         }  
  11.         if (seconds > 59) {  
  12.             return (OS_TIME_INVALID_SECONDS);  
  13.         }  
  14.         If (milli > 999) {  
  15.             return (OS_TIME_INVALID_MILLI);  
  16.         }  
  17.         ticks = (INT32U)hours    * 3600L * OS_TICKS_PER_SEC               //(2)  
  18.               + (INT32U)minutes  *   60L * OS_TICKS_PER_SEC  
  19.               + (INT32U)seconds  *         OS_TICKS_PER_SEC  
  20.               + OS_TICKS_PER_SEC * ((INT32U)milli  
  21.               + 500L/OS_TICKS_PER_SEC) / 1000L;                           //(3)  
  22.         loops = ticks / 65536L;                                           //(4)  
  23.         ticks = ticks % 65536L;                                           //(5)  
  24.         OSTimeDly(ticks);                                                 //(6)  
  25.         while (loops > 0) {                                               //(7)  
  26.             OSTimeDly(32768);                                             //(8)  
  27.             OSTimeDly(32768);  
  28.             loops--;  
  29.         }  
  30.         return (OS_NO_ERR);  
  31.     } else {  
  32.         return (OS_TIME_ZERO_DLY);                                         //(9)  
  33.     }  
  34. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值