OS_TIME.c
上传用户:jinguanrq
上传日期:2022-06-04
资源大小:724k
文件大小:9k
源码类别:

uCOS

开发平台:

C/C++

  1. /*
  2. *********************************************************************************************************
  3. *                                                uC/OS-II
  4. *                                          The Real-Time Kernel
  5. *                                             TIME MANAGEMENT
  6. *
  7. *                        (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
  8. *                                           All Rights Reserved
  9. *
  10. *                                                  V2.00
  11. *
  12. * File : OS_TIME.C
  13. * By   : Jean J. Labrosse
  14. *********************************************************************************************************
  15. */
  16. #ifndef  OS_MASTER_FILE
  17. #include "includes.h"
  18. #endif
  19. /*
  20. *********************************************************************************************************
  21. *                                DELAY TASK 'n' TICKS   (n from 0 to 65535)
  22. *
  23. * Description: This function is called to delay execution of the currently running task until the 
  24. *              specified number of system ticks expires.  This, of course, directly equates to delaying
  25. *              the current task for some time to expire.  No delay will result If the specified delay is 
  26. *              0.  If the specified delay is greater than 0 then, a context switch will result.
  27. *
  28. * Arguments  : ticks     is the time delay that the task will be suspended in number of clock 'ticks'.  
  29. *                        Note that by specifying 0, the task will not be delayed.
  30. *
  31. * Returns    : none
  32. *********************************************************************************************************
  33. */
  34. void OSTimeDly (INT16U ticks)
  35. {
  36.     if (ticks > 0) {                                                      /* 0 means no delay!         */
  37.         OS_ENTER_CRITICAL();
  38.         if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {  /* Delay current task        */
  39.             OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
  40.         }
  41.         OSTCBCur->OSTCBDly = ticks;                                       /* Load ticks in TCB         */
  42.         OS_EXIT_CRITICAL();
  43.         OSSched();                                                        /* Find next task to run!    */
  44.     }
  45. }
  46. /*$PAGE*/
  47. /*
  48. *********************************************************************************************************
  49. *                                     DELAY TASK FOR SPECIFIED TIME
  50. *
  51. * Description: This function is called to delay execution of the currently running task until some time
  52. *              expires.  This call allows you to specify the delay time in HOURS, MINUTES, SECONDS and
  53. *              MILLISECONDS instead of ticks.
  54. *
  55. * Arguments  : hours     specifies the number of hours that the task will be delayed (max. is 255)
  56. *              minutes   specifies the number of minutes (max. 59)    
  57. *              seconds   specifies the number of seconds (max. 59)
  58. *              milli     specifies the number of milliseconds (max. 999)
  59. *
  60. * Returns    : OS_NO_ERR
  61. *              OS_TIME_INVALID_MINUTES
  62. *              OS_TIME_INVALID_SECONDS
  63. *              OS_TIME_INVALID_MS
  64. *              OS_TIME_ZERO_DLY
  65. *
  66. * Note(s)    : The resolution on the milliseconds depends on the tick rate.  For example, you can't do
  67. *              a 10 mS delay if the ticker interrupts every 100 mS.  In this case, the delay would be
  68. *              set to 0.  The actual delay is rounded to the nearest tick.
  69. *********************************************************************************************************
  70. */
  71. INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli)
  72. {
  73.     INT32U ticks;
  74.     INT16U loops;
  75.     if (hours > 0 || minutes > 0 || seconds > 0 || milli > 0) {
  76.         if (minutes > 59) {
  77.             return (OS_TIME_INVALID_MINUTES);    /* Validate arguments to be within range              */
  78.         }
  79.         if (seconds > 59) {
  80.             return (OS_TIME_INVALID_SECONDS);
  81.         }
  82.         if (milli > 999) {
  83.             return (OS_TIME_INVALID_MILLI);
  84.         }
  85.                                                  /* Compute the total number of clock ticks required.. */
  86.                                                  /* .. (rounded to the nearest tick)                   */
  87.         ticks = ((INT32U)hours * 3600L + (INT32U)minutes * 60L + (INT32U)seconds) * OS_TICKS_PER_SEC
  88.               + OS_TICKS_PER_SEC * ((INT32U)milli + 500L / OS_TICKS_PER_SEC) / 1000L;
  89.         loops = ticks / 65536L;                  /* Compute the integral number of 65536 tick delays   */
  90.         ticks = ticks % 65536L;                  /* Obtain  the fractional number of ticks             */
  91.         OSTimeDly(ticks);
  92.         while (loops > 0) {
  93.             OSTimeDly(32768);
  94.             OSTimeDly(32768);
  95.             loops--;
  96.         }
  97.         return (OS_NO_ERR);
  98.     } else {
  99.         return (OS_TIME_ZERO_DLY);
  100.     }
  101. }
  102. /*$PAGE*/
  103. /*
  104. *********************************************************************************************************
  105. *                                         RESUME A DELAYED TASK
  106. *
  107. * Description: This function is used resume a task that has been delayed through a call to either
  108. *              OSTimeDly() or OSTimeDlyHMSM().  Note that you MUST NOT call this function to resume a 
  109. *              task that is waiting for an event with timeout.  This situation would make the task look 
  110. *              like a timeout occurred (unless you desire this effect).  Also, you cannot resume a task 
  111. *              that has called OSTimeDlyHMSM() with a combined time that exceeds 65535 clock ticks.  In 
  112. *              other words, if the clock tick runs at 100 Hz then, you will not be able to resume a 
  113. *              delayed task that called OSTimeDlyHMSM(0, 10, 55, 350) or higher.  
  114. *
  115. *                  (10 Minutes * 60 + 55 Seconds + 0.35) * 100 ticks/second.
  116. *
  117. * Arguments  : prio      specifies the priority of the task to resume
  118. *
  119. * Returns    : OS_NO_ERR                 Task has been resumed
  120. *              OS_PRIO_INVALID           if the priority you specify is higher that the maximum allowed 
  121. *                                        (i.e. >= OS_LOWEST_PRIO)
  122. *              OS_TIME_NOT_DLY           Task is not waiting for time to expire
  123. *              OS_TASK_NOT_EXIST         The desired task has not been created
  124. *********************************************************************************************************
  125. */
  126. INT8U OSTimeDlyResume (INT8U prio)
  127. {
  128.     OS_TCB *ptcb;
  129.     if (prio >= OS_LOWEST_PRIO) {
  130.         return (OS_PRIO_INVALID);
  131.     }
  132.     OS_ENTER_CRITICAL();
  133.     ptcb = (OS_TCB *)OSTCBPrioTbl[prio];                   /* Make sure that task exist                */
  134.     if (ptcb != (OS_TCB *)0) {
  135.         if (ptcb->OSTCBDly != 0) {                         /* See if task is delayed                   */
  136.             ptcb->OSTCBDly  = 0;                           /* Clear the time delay                     */
  137.             if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) {    /* See if task is ready to run              */
  138.                 OSRdyGrp               |= ptcb->OSTCBBitY; /* Make task ready to run                   */
  139.                 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
  140.                 OS_EXIT_CRITICAL();
  141.                 OSSched();                                 /* See if this is new highest priority      */
  142.             } else {
  143.                 OS_EXIT_CRITICAL();                        /* Task may be suspended                    */
  144.             }
  145.             return (OS_NO_ERR);
  146.         } else {
  147.             OS_EXIT_CRITICAL();
  148.             return (OS_TIME_NOT_DLY);                      /* Indicate that task was not delayed       */
  149.         }
  150.     } else {
  151.         OS_EXIT_CRITICAL();
  152.         return (OS_TASK_NOT_EXIST);                        /* The task does not exist                  */
  153.     }
  154. }
  155. /*$PAGE*/
  156. /*
  157. *********************************************************************************************************
  158. *                                         GET CURRENT SYSTEM TIME
  159. *
  160. * Description: This function is used by your application to obtain the current value of the 32-bit 
  161. *              counter which keeps track of the number of clock ticks.
  162. *
  163. * Arguments  : none
  164. *
  165. * Returns    : The current value of OSTime
  166. *********************************************************************************************************
  167. */
  168. INT32U OSTimeGet (void)
  169. {
  170.     INT32U ticks;
  171.     OS_ENTER_CRITICAL();
  172.     ticks = OSTime;
  173.     OS_EXIT_CRITICAL();
  174.     return (ticks);
  175. }
  176. /*
  177. *********************************************************************************************************
  178. *                                            SET SYSTEM CLOCK
  179. *
  180. * Description: This function sets the 32-bit counter which keeps track of the number of clock ticks.
  181. *
  182. * Arguments  : ticks      specifies the new value that OSTime needs to take.
  183. *
  184. * Returns    : none
  185. *********************************************************************************************************
  186. */
  187. void OSTimeSet (INT32U ticks)
  188. {
  189.     OS_ENTER_CRITICAL();
  190.     OSTime = ticks;
  191.     OS_EXIT_CRITICAL();
  192. }