按时分秒延时函数 OSTimeDlyHMSM()

来源:互联网 发布:现在有5g网络吗 编辑:程序博客网 时间:2024/05/07 03:38
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
  1. OSTimeDly()虽然是一个非常有用的函数,但用户的应用程序需要知道延时时间对应的时钟节拍的数目。用户可以使用定义全局常数OS_TICKS_PER_SEC(参看OS_CFG.H)的方法将时间转换成时钟段,但这种方法有时显得比较愚笨。笔者增加了OSTimeDlyHMSM()函数后,用户就可以按小时(H)、分(M)、秒(S)和毫秒(m)来定义时间了,这样会显得更自然些。与OSTimeDly()一样,调用OSTimeDlyHMSM()函数也会使µC/OS-Ⅱ进行一次任务调度,并且执行下一个优先级最高的就绪态任务。任务调用OSTimeDlyHMSM()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时(参看5.02,恢复延时的任务OSTimeDlyResume()),它就会马上处于就绪态。同样,只有当该任务在所有就绪态任务中具有最高的优先级时,它才会立即运行。  
  2.     程序清单 L5.2所示的是OSTimeDlyHMSM()的代码。从中可以看出,应用程序是通过用小时、分、秒和毫秒指定延时来调用该函数的。在实际应用中,用户应避免使任务延时过长的时间,因为从任务中获得一些反馈行为(如减少计数器,清除LED等等)经常是很不错的事。但是,如果用户确实需要延时长时间的话,µC/OS-Ⅱ可以将任务延时长达256个小时(接近11天)。  
  3.     OSTimeDlyHMSM()一开始先要检验用户是否为参数定义了有效的值[L5.2(1)]。与OSTimeDly()一样,即使用户没有定义延时,OSTimeDlyHMSM()也是存在的[L5.2(9)]。因为µC/OS-Ⅱ只知道节拍,所以节拍总数是从指定的时间中计算出来的[L5.2(3)]。很明显,程序清单 L5.2中的程序并不是十分有效的。笔者只是用这种方法告诉大家一个公式,这样用户就可以知道怎样计算总的节拍数了。真正有意义的只是OS_TICKS_PER_SEC。[L5.2(3)]决定了最接近需要延迟的时间的时钟节拍总数。500/OS_TICKS_PER_SECOND的值基本上与0.5个节拍对应的毫秒数相同。例如,若将时钟频率(OS_TICKS_PER_SEC)设置成100Hz(10ms),4ms的延时不会产生任何延时!而5ms的延时就等于延时10ms。  
  4.     µC/OS-Ⅱ支持的延时最长为65,535个节拍。要想支持更长时间的延时,如L5.2(2)所示,OSTimeDlyHMSM()确定了用户想延时多少次超过65,535个节拍的数目[L5.2(4)]和剩下的节拍数[L5.2(5)]。例如,若OS_TICKS_PER_SEC的值为100,用户想延时15分钟,则OSTimeDlyHMSM()会延时15x60x100=90,000个时钟。这个延时会被分割成两次32,768个节拍的延时(因为用户只能延时65,535个节拍而不是65536个节拍)和一次24,464个节拍的延时。在这种情况下,OSTimeDlyHMSM()首先考虑剩下的节拍,然后是超过65,535的节拍数[L5.2(7)和(8)](即两个32,768个节拍延时)。  
  5.   
  6. 程序清单 L 5.2  OSTimeDlyHMSM().  
  7. INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli)  
  8. {  
  9.     INT32U ticks;  
  10.     INT16U loops;  
  11.   
  12.   
  13.     if (hours > 0 || minutes > 0 || seconds > 0 || milli > 0) {         (1)  
  14.         if (minutes > 59) {  
  15.             return (OS_TIME_INVALID_MINUTES);  
  16.         }  
  17.         if (seconds > 59) {  
  18.             return (OS_TIME_INVALID_SECONDS);  
  19.         }  
  20.         If (milli > 999) {  
  21.             return (OS_TIME_INVALID_MILLI);  
  22.         }   
  23.         ticks = (INT32U)hours    * 3600L * OS_TICKS_PER_SEC                 (2)  
  24.               + (INT32U)minutes  *   60L * OS_TICKS_PER_SEC  
  25.               + (INT32U)seconds  *         OS_TICKS_PER_SEC  
  26.               + OS_TICKS_PER_SEC * ((INT32U)milli  
  27.               + 500L/OS_TICKS_PER_SEC) / 1000L; (3)  
  28.         loops = ticks / 65536L;                                     (4)  
  29.         ticks = ticks % 65536L;                                          (5)        OSTimeDly(ticks);                                                  (6)  
  30.         while (loops > 0) {                                               (7)  
  31.             OSTimeDly(32768);                                             (8)  
  32.             OSTimeDly(32768);  
  33.             loops--;  
  34.         }  
  35.         return (OS_NO_ERR);  
  36.     } else {  
  37.         return (OS_TIME_ZERO_DLY);                                         (9)  
  38.     }  
  39. }  
  40.   
  41.     由于OSTimeDlyHMSM()的具体实现方法,用户不能结束延时调用OSTimeDlyHMSM()要求延时超过65535个节拍的任务。换句话说,如果时钟节拍的频率是100Hz,用户不能让调用OSTimeDlyHMSM(0,10,55,350)或更长延迟时间的任务结束延时。 
0 0
原创粉丝点击