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

📄 os_time.lst

📁 ARM仿真案例
💻 LST
📖 第 1 页 / 共 2 页
字号:
##############################################################################
#                                                                            #
# IAR ARM ANSI C/C++ Compiler V4.40A/W32 EVALUATION    21/Jul/2006  16:23:30 #
# Copyright 1999-2005 IAR Systems. All rights reserved.                      #
# Time limited license: 22 days left                                         #
#                                                                            #
#    Cpu mode        =  interwork                                            #
#    Endian          =  little                                               #
#    Stack alignment =  4                                                    #
#    Source file     =  E:\Project\ucos-ii\leddisp\uCOS-II\os_time.c         #
#    Command line    =  E:\Project\ucos-ii\leddisp\uCOS-II\os_time.c -lCN    #
#                       E:\Project\ucos-ii\leddisp\Debug\List\ -lA           #
#                       E:\Project\ucos-ii\leddisp\Debug\List\ -o            #
#                       E:\Project\ucos-ii\leddisp\Debug\Obj\ -s9 --no_cse   #
#                       --no_unroll --no_inline --no_code_motion --no_tbaa   #
#                       --no_clustering --no_scheduling --debug --cpu_mode   #
#                       thumb --endian little --cpu ARM7TDMI-S               #
#                       --stack_align 4 --interwork -e --fpu None            #
#                       --dlib_config "e:\Program Files\IAR                  #
#                       Systems\Embedded Workbench 4.0                       #
#                       Evaluation\ARM\LIB\dl4tptinl8n.h" -I                 #
#                       E:\Project\ucos-ii\leddisp\ -I                       #
#                       E:\Project\ucos-ii\leddisp\App\ -I                   #
#                       E:\Project\ucos-ii\leddisp\ARM\ -I                   #
#                       E:\Project\ucos-ii\leddisp\BSP\ -I                   #
#                       E:\Project\ucos-ii\leddisp\uCOS-II\ -I "e:\Program   #
#                       Files\IAR Systems\Embedded Workbench 4.0             #
#                       Evaluation\ARM\INC\"                                 #
#    List file       =  E:\Project\ucos-ii\leddisp\Debug\List\os_time.lst    #
#    Object file     =  E:\Project\ucos-ii\leddisp\Debug\Obj\os_time.r79     #
#                                                                            #
#                                                                            #
##############################################################################

E:\Project\ucos-ii\leddisp\uCOS-II\os_time.c
      1          /*
      2          *********************************************************************************************************
      3          *                                                uC/OS-II
      4          *                                          The Real-Time Kernel
      5          *                                             TIME MANAGEMENT
      6          *
      7          *                          (c) Copyright 1992-2003, 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 <ucos_ii.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          

   \                                 In segment CODE, align 4, keep-with-next
     35          void  OSTimeDly (INT16U ticks)
     36          {
   \                     OSTimeDly:
   \   00000000   70B5               PUSH     {R4-R6,LR}
   \   00000002   0400               MOVS     R4,R0
     37          #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
     38              OS_CPU_SR  cpu_sr;
     39          #endif    
     40              INT8U      y;
     41          
     42          
     43              if (ticks > 0) {                             /* 0 means no delay!                                  */
   \   00000004   22D0               BEQ      ??OSTimeDly_0
     44                  OS_ENTER_CRITICAL();
   \   00000006   ........           _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
     45                  y            =  OSTCBCur->OSTCBY;        /* Delay current task                                 */
   \   0000000A   1249               LDR      R1,??OSTimeDly_1  ;; OSTCBCur
   \   0000000C   0968               LDR      R1,[R1, #+0]
   \   0000000E   2F31               ADDS     R1,R1,#+47
   \   00000010   0978               LDRB     R1,[R1, #+0]
     46                  OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
   \   00000012   ....               LDR      R3,??DataTable8  ;; OSRdyTbl
   \   00000014   ....               LDR      R6,??DataTable8  ;; OSRdyTbl
   \   00000016   755C               LDRB     R5,[R6, R1]
   \   00000018   0E4E               LDR      R6,??OSTimeDly_1  ;; OSTCBCur
   \   0000001A   3668               LDR      R6,[R6, #+0]
   \   0000001C   3036               ADDS     R6,R6,#+48
   \   0000001E   3678               LDRB     R6,[R6, #+0]
   \   00000020   B543               BICS     R5,R5,R6
   \   00000022   5D54               STRB     R5,[R3, R1]
     47                  if (OSRdyTbl[y] == 0) {  
   \   00000024   ....               LDR      R2,??DataTable8  ;; OSRdyTbl
   \   00000026   515C               LDRB     R1,[R2, R1]
   \   00000028   0029               CMP      R1,#+0
   \   0000002A   08D1               BNE      ??OSTimeDly_2
     48                      OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
   \   0000002C   ....               LDR      R1,??DataTable6  ;; OSRdyGrp
   \   0000002E   ....               LDR      R2,??DataTable6  ;; OSRdyGrp
   \   00000030   1278               LDRB     R2,[R2, #+0]
   \   00000032   084B               LDR      R3,??OSTimeDly_1  ;; OSTCBCur
   \   00000034   1B68               LDR      R3,[R3, #+0]
   \   00000036   3133               ADDS     R3,R3,#+49
   \   00000038   1B78               LDRB     R3,[R3, #+0]
   \   0000003A   9A43               BICS     R2,R2,R3
   \   0000003C   0A70               STRB     R2,[R1, #+0]
     49                  }
     50                  OSTCBCur->OSTCBDly = ticks;              /* Load ticks in TCB                                  */
   \                     ??OSTimeDly_2:
   \   0000003E   0549               LDR      R1,??OSTimeDly_1  ;; OSTCBCur
   \   00000040   0968               LDR      R1,[R1, #+0]
   \   00000042   4C85               STRH     R4,[R1, #+42]
     51                  OS_EXIT_CRITICAL();
   \   00000044   ........           _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
     52                  OS_Sched();                              /* Find next task to run!                             */
   \   00000048   ........           _BLF     OS_Sched,??OS_Sched??rT
     53              }
     54          }
   \                     ??OSTimeDly_0:
   \   0000004C   70BC               POP      {R4-R6}
   \   0000004E   01BC               POP      {R0}
   \   00000050   0047               BX       R0               ;; return
   \   00000052   C046               Nop      
   \                     ??OSTimeDly_1:
   \   00000054   ........           DC32     OSTCBCur
     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

   \                                 In segment CODE, align 4, keep-with-next
     82          INT8U  OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli)
     83          {
   \                     OSTimeDlyHMSM:
   \   00000000   10B5               PUSH     {R4,LR}
     84              INT32U ticks;
     85              INT16U loops;
     86          
     87          
     88              if (hours == 0) {
   \   00000002   0028               CMP      R0,#+0
   \   00000004   07D1               BNE      ??OSTimeDlyHMSM_0
     89                  if (minutes == 0) {
   \   00000006   0029               CMP      R1,#+0
   \   00000008   05D1               BNE      ??OSTimeDlyHMSM_0
     90                      if (seconds == 0) {
   \   0000000A   002A               CMP      R2,#+0
   \   0000000C   07D1               BNE      ??OSTimeDlyHMSM_1
     91                          if (milli == 0) {
   \   0000000E   002B               CMP      R3,#+0
   \   00000010   09D1               BNE      ??OSTimeDlyHMSM_2
     92                              return (OS_TIME_ZERO_DLY);
   \   00000012   5420               MOVS     R0,#+84
   \   00000014   34E0               B        ??OSTimeDlyHMSM_3
     93                          }
     94                      }
     95                  }
     96              }
     97              if (minutes > 59) {
   \                     ??OSTimeDlyHMSM_0:
   \   00000016   3C29               CMP      R1,#+60
   \   00000018   01D3               BCC      ??OSTimeDlyHMSM_1
     98                  return (OS_TIME_INVALID_MINUTES);        /* Validate arguments to be within range              */
   \   0000001A   5120               MOVS     R0,#+81
   \   0000001C   30E0               B        ??OSTimeDlyHMSM_3
     99              }
    100              if (seconds > 59) {
   \                     ??OSTimeDlyHMSM_1:
   \   0000001E   3C2A               CMP      R2,#+60
   \   00000020   01D3               BCC      ??OSTimeDlyHMSM_2
    101                  return (OS_TIME_INVALID_SECONDS);
   \   00000022   5220               MOVS     R0,#+82
   \   00000024   2CE0               B        ??OSTimeDlyHMSM_3
    102              }
    103              if (milli > 999) {
   \                     ??OSTimeDlyHMSM_2:
   \   00000026   FA24               MOVS     R4,#+250
   \   00000028   A400               LSLS     R4,R4,#+2        ;; #+1000
   \   0000002A   A342               CMP      R3,R4
   \   0000002C   01D3               BCC      ??OSTimeDlyHMSM_4
    104                  return (OS_TIME_INVALID_MILLI);
   \   0000002E   5320               MOVS     R0,#+83
   \   00000030   26E0               B        ??OSTimeDlyHMSM_3
    105              }
    106                                                           /* Compute the total number of clock ticks required.. */
    107                                                           /* .. (rounded to the nearest tick)                   */
    108              ticks = ((INT32U)hours * 3600L + (INT32U)minutes * 60L + (INT32U)seconds) * OS_TICKS_PER_SEC
    109                    + OS_TICKS_PER_SEC * ((INT32U)milli + 500L / OS_TICKS_PER_SEC) / 1000L;
   \                     ??OSTimeDlyHMSM_4:
   \   00000032   E124               MOVS     R4,#+225
   \   00000034   2401               LSLS     R4,R4,#+4        ;; #+3600
   \   00000036   6043               MULS     R0,R4,R0
   \   00000038   3C24               MOVS     R4,#+60
   \   0000003A   6143               MULS     R1,R4,R1
   \   0000003C   4018               ADDS     R0,R0,R1
   \   0000003E   8218               ADDS     R2,R0,R2
   \   00000040   6420               MOVS     R0,#+100
   \   00000042   4243               MULS     R2,R0,R2
   \   00000044   5B1D               ADDS     R3,R3,#+5
   \   00000046   4343               MULS     R3,R0,R3
   \   00000048   1800               MOVS     R0,R3
   \   0000004A   FA21               MOVS     R1,#+250
   \   0000004C   8900               LSLS     R1,R1,#+2        ;; #+1000
   \   0000004E   ........           _BLF     ??divu32_t,??rT??divu32_t
   \   00000052   5018               ADDS     R0,R2,R1
    110              loops = (INT16U)(ticks / 65536L);            /* Compute the integral number of 65536 tick delays   */
   \   00000054   040C               LSRS     R4,R0,#+16
    111              ticks = ticks % 65536L;                      /* Obtain  the fractional number of ticks             */
    112              OSTimeDly((INT16U)ticks);
   \   00000056   0004               LSLS     R0,R0,#+16
   \   00000058   000C               LSRS     R0,R0,#+16
   \   0000005A   ........           BL       OSTimeDly
   \   0000005E   2000               MOVS     R0,R4
   \   00000060   0BD1               BNE      ??OSTimeDlyHMSM_5
   \   00000062   0CE0               B        ??OSTimeDlyHMSM_6
    113              while (loops > 0) {
    114                  OSTimeDly((INT16U)32768u);
   \                     ??OSTimeDlyHMSM_7:
   \   00000064   8020               MOVS     R0,#+128
   \   00000066   0002               LSLS     R0,R0,#+8        ;; #+32768
   \   00000068   ........           BL       OSTimeDly
    115                  OSTimeDly((INT16U)32768u);
   \   0000006C   8020               MOVS     R0,#+128
   \   0000006E   0002               LSLS     R0,R0,#+8        ;; #+32768
   \   00000070   ........           BL       OSTimeDly
    116                  loops--;
   \   00000074   641E               SUBS     R4,R4,#+1
   \   00000076   2404               LSLS     R4,R4,#+16
   \   00000078   240C               LSRS     R4,R4,#+16

⌨️ 快捷键说明

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