⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_time.lst

📁 ucos v2.62 安装程序 附带已移植到C8051F020的UCOS源码
💻 LST
字号:
C51 COMPILER V8.05a   OS_TIME                                                              04/11/2007 16:19:50 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE OS_TIME
OBJECT MODULE PLACED IN ..\Output\os_time.obj
COMPILER INVOKED BY: D:\Program Files\keil\C51\BIN\C51.EXE ..\SOURCE\os_time.c LARGE BROWSE INCDIR(..\app;..\Main;..\Por
                    -t;..\SOURCE) DEBUG OBJECTEXTEND PRINT(..\Output\os_time.lst) OBJECT(..\Output\os_time.obj)

line level    source

   1          /*
   2          *********************************************************************************************************
   3          *                                                uC/OS-II
   4          *                                          The Real-Time Kernel
   5          *                                             TIME MANAGEMENT
   6          *
   7          *                          (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
   8          *                                           All Rights Reserved
   9          *
  10          * File : OS_TIME.C
  11          * By   : Jean J. Labrosse
  12          *********************************************************************************************************
  13          */
  14          
  15          #ifndef  OS_MASTER_FILE
  16          #include "includes.h"
  17          #endif
  18          
  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          
  35          void  OSTimeDly (INT16U ticks)
  36          {
  37   1      #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
                  OS_CPU_SR  cpu_sr;
              #endif    
  40   1          INT8U      y;
  41   1      
  42   1      
  43   1          if (ticks > 0) {                             /* 0 means no delay!                                  */
  44   2              OS_ENTER_CRITICAL();
  45   2                      y            =  OSTCBCur->OSTCBY;            /* Delay current task                                 */
  46   2                      OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
  47   2              if (OSRdyTbl[y] == 0) {  
  48   3                  OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
  49   3              }
  50   2              OSTCBCur->OSTCBDly = ticks;              /* Load ticks in TCB                                  */
  51   2              OS_EXIT_CRITICAL();
  52   2              OS_Sched();                              /* Find next task to run!                             */
  53   2          }
  54   1      }
C51 COMPILER V8.05a   OS_TIME                                                              04/11/2007 16:19:50 PAGE 2   

  55          /*$PAGE*/
  56          /*
  57          *********************************************************************************************************
  58          *                                     DELAY TASK FOR SPECIFIED TIME
  59          *
  60          * Description: This function is called to delay execution of the currently running task until some time
  61          *              expires.  This call allows you to specify the delay time in HOURS, MINUTES, SECONDS and
  62          *              MILLISECONDS instead of ticks.
  63          *
  64          * Arguments  : hours     specifies the number of hours that the task will be delayed (max. is 255)
  65          *              minutes   specifies the number of minutes (max. 59)
  66          *              seconds   specifies the number of seconds (max. 59)
  67          *              milli     specifies the number of milliseconds (max. 999)
  68          *
  69          * Returns    : OS_NO_ERR
  70          *              OS_TIME_INVALID_MINUTES
  71          *              OS_TIME_INVALID_SECONDS
  72          *              OS_TIME_INVALID_MS
  73          *              OS_TIME_ZERO_DLY
  74          *
  75          * Note(s)    : The resolution on the milliseconds depends on the tick rate.  For example, you can't do
  76          *              a 10 mS delay if the ticker interrupts every 100 mS.  In this case, the delay would be
  77          *              set to 0.  The actual delay is rounded to the nearest tick.
  78          *********************************************************************************************************
  79          */
  80          
  81          #if OS_TIME_DLY_HMSM_EN > 0
  82          INT8U  OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli)  KCREENTRANT     
  83          {
  84   1          INT32U ticks;
  85   1          INT16U loops;
  86   1      
  87   1      
  88   1          if (hours == 0) {
  89   2              if (minutes == 0) {
  90   3                  if (seconds == 0) {
  91   4                      if (milli == 0) {
  92   5                          return (OS_TIME_ZERO_DLY);
  93   5                                      }
  94   4                              }
  95   3                      }
  96   2              }
  97   1          if (minutes > 59) {
  98   2              return (OS_TIME_INVALID_MINUTES);        /* Validate arguments to be within range              */
  99   2          }
 100   1          if (seconds > 59) {
 101   2              return (OS_TIME_INVALID_SECONDS);
 102   2          }
 103   1          if (milli > 999) {
 104   2              return (OS_TIME_INVALID_MILLI);
 105   2          }
 106   1                                                       /* Compute the total number of clock ticks required.. */
 107   1                                                       /* .. (rounded to the nearest tick)                   */
 108   1          ticks = ((INT32U)hours * 3600L + (INT32U)minutes * 60L + (INT32U)seconds) * OS_TICKS_PER_SEC
 109   1                + OS_TICKS_PER_SEC * ((INT32U)milli + 500L / OS_TICKS_PER_SEC) / 1000L;
 110   1          loops = (INT16U)(ticks / 65536L);            /* Compute the integral number of 65536 tick delays   */
 111   1          ticks = ticks % 65536L;                      /* Obtain  the fractional number of ticks             */
 112   1          OSTimeDly((INT16U)ticks);
 113   1          while (loops > 0) {
 114   2              OSTimeDly((INT16U)32768u);
 115   2              OSTimeDly((INT16U)32768u);
 116   2              loops--;
C51 COMPILER V8.05a   OS_TIME                                                              04/11/2007 16:19:50 PAGE 3   

 117   2          }
 118   1          return (OS_NO_ERR);
 119   1      }
 120          #endif
 121          /*$PAGE*/
 122          /*
 123          *********************************************************************************************************
 124          *                                         RESUME A DELAYED TASK
 125          *
 126          * Description: This function is used resume a task that has been delayed through a call to either
 127          *              OSTimeDly() or OSTimeDlyHMSM().  Note that you MUST NOT call this function to resume a
 128          *              task that is waiting for an event with timeout.  This situation would make the task look
 129          *              like a timeout occurred (unless you desire this effect).  Also, you cannot resume a task
 130          *              that has called OSTimeDlyHMSM() with a combined time that exceeds 65535 clock ticks.  In
 131          *              other words, if the clock tick runs at 100 Hz then, you will not be able to resume a
 132          *              delayed task that called OSTimeDlyHMSM(0, 10, 55, 350) or higher.
 133          *
 134          *                  (10 Minutes * 60 + 55 Seconds + 0.35) * 100 ticks/second.
 135          *
 136          * Arguments  : prio      specifies the priority of the task to resume
 137          *
 138          * Returns    : OS_NO_ERR                 Task has been resumed
 139          *              OS_PRIO_INVALID           if the priority you specify is higher that the maximum allowed
 140          *                                        (i.e. >= OS_LOWEST_PRIO)
 141          *              OS_TIME_NOT_DLY           Task is not waiting for time to expire
 142          *              OS_TASK_NOT_EXIST         The desired task has not been created
 143          *********************************************************************************************************
 144          */
 145          
 146          #if OS_TIME_DLY_RESUME_EN > 0
 147          INT8U  OSTimeDlyResume (INT8U prio)     KCREENTRANT     
 148          {
 149   1      #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
                  OS_CPU_SR  cpu_sr;
              #endif    
 152   1          OS_TCB    *ptcb;
 153   1      
 154   1      
 155   1          if (prio >= OS_LOWEST_PRIO) {
 156   2              return (OS_PRIO_INVALID);
 157   2          }
 158   1          OS_ENTER_CRITICAL();
 159   1          ptcb = (OS_TCB *)OSTCBPrioTbl[prio];                   /* Make sure that task exist                */
 160   1          if (ptcb != (OS_TCB *)0) {
 161   2              if (ptcb->OSTCBDly != 0) {                         /* See if task is delayed                   */
 162   3                  ptcb->OSTCBDly  = 0;                           /* Clear the time delay                     */
 163   3                  if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) {  /* See if task is ready to run  */
 164   4                      OSRdyGrp               |= ptcb->OSTCBBitY;             /* Make task ready to run       */
 165   4                      OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
 166   4                      OS_EXIT_CRITICAL();
 167   4                      OS_Sched();                                /* See if this is new highest priority      */
 168   4                  } else {
 169   4                      OS_EXIT_CRITICAL();                        /* Task may be suspended                    */
 170   4                  }
 171   3                  return (OS_NO_ERR);
 172   3              } else {
 173   3                  OS_EXIT_CRITICAL();
 174   3                  return (OS_TIME_NOT_DLY);                      /* Indicate that task was not delayed       */
 175   3              }
 176   2          }
 177   1          OS_EXIT_CRITICAL();
 178   1          return (OS_TASK_NOT_EXIST);                            /* The task does not exist                  */
C51 COMPILER V8.05a   OS_TIME                                                              04/11/2007 16:19:50 PAGE 4   

 179   1      }
 180          #endif    
 181          /*$PAGE*/
 182          /*
 183          *********************************************************************************************************
 184          *                                         GET CURRENT SYSTEM TIME
 185          *
 186          * Description: This function is used by your application to obtain the current value of the 32-bit
 187          *              counter which keeps track of the number of clock ticks.
 188          *
 189          * Arguments  : none
 190          *
 191          * Returns    : The current value of OSTime
 192          *********************************************************************************************************
 193          */
 194          
 195          #if OS_TIME_GET_SET_EN > 0
 196          INT32U  OSTimeGet (void)
 197          {
 198   1      #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
                  OS_CPU_SR  cpu_sr;
              #endif    
 201   1          INT32U     ticks;
 202   1      
 203   1      
 204   1          OS_ENTER_CRITICAL();
 205   1          ticks = OSTime;
 206   1          OS_EXIT_CRITICAL();
 207   1          return (ticks);
 208   1      }
 209          #endif    
 210          
 211          /*
 212          *********************************************************************************************************
 213          *                                            SET SYSTEM CLOCK
 214          *
 215          * Description: This function sets the 32-bit counter which keeps track of the number of clock ticks.
 216          *
 217          * Arguments  : ticks      specifies the new value that OSTime needs to take.
 218          *
 219          * Returns    : none
 220          *********************************************************************************************************
 221          */
 222          
 223          #if OS_TIME_GET_SET_EN > 0
 224          void  OSTimeSet (INT32U ticks)  KCREENTRANT     
 225          {
 226   1      #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
                  OS_CPU_SR  cpu_sr;
              #endif    
 229   1      
 230   1      
 231   1          OS_ENTER_CRITICAL();
 232   1          OSTime = ticks;
 233   1          OS_EXIT_CRITICAL();
 234   1      }
 235          #endif
 236          
 237          void OSTimeInit()  KCREENTRANT  
 238          {       uint16 tmp = 0;
 239   1          TMOD &=0xf1;
 240   1              TMOD |=0x01;
C51 COMPILER V8.05a   OS_TIME                                                              04/11/2007 16:19:50 PAGE 5   

 241   1              CKCON &=0xf0;//系统时钟的12分频 
 242   1          tmp = -(SYSCLK/12/TICKS); 
 243   1              TH0 =tmp/256;
 244   1              TL0 =tmp%256;
 245   1              TR0 = 1;
 246   1      }    


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    947    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----       1
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -