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

📄 os_time.s79

📁 ARM仿真案例
💻 S79
📖 第 1 页 / 共 2 页
字号:
//////////////////////////////////////////////////////////////////////////////
//                                                                           /
// IAR ARM ANSI C/C++ Compiler V4.40A/W32 EVALUATION   21/Jul/2006  16:27:50 /
// 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\spi\uCOS-II\os_time.c            /
//    Command line    =  E:\Project\ucos-ii\spi\uCOS-II\os_time.c -lCN       /
//                       E:\Project\ucos-ii\spi\Debug\List\ -lA              /
//                       E:\Project\ucos-ii\spi\Debug\List\ -o               /
//                       E:\Project\ucos-ii\spi\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\spi\ -I                          /
//                       E:\Project\ucos-ii\spi\App\ -I                      /
//                       E:\Project\ucos-ii\spi\ARM\ -I                      /
//                       E:\Project\ucos-ii\spi\BSP\ -I                      /
//                       E:\Project\ucos-ii\spi\uCOS-II\ -I "e:\Program      /
//                       Files\IAR Systems\Embedded Workbench 4.0            /
//                       Evaluation\ARM\INC\"                                /
//    List file       =  E:\Project\ucos-ii\spi\Debug\List\os_time.s79       /
//                                                                           /
//                                                                           /
//////////////////////////////////////////////////////////////////////////////

        NAME os_time

        RTMODEL "StackAlign4", "USED"
        RTMODEL "__cpu_mode", "__pcs__interwork"
        RTMODEL "__data_model", "absolute"
        RTMODEL "__endian", "little"
        RTMODEL "__rt_version", "6"

        RSEG CSTACK:DATA:NOROOT(2)

        EXTERN ??divu32_t

??DataTable0 EQU 0
??DataTable1 EQU 0
??DataTable2 EQU 0
??DataTable3 EQU 0
??DataTable4 EQU 0
??DataTable5 EQU 0
??DataTable7 EQU 0
??DataTable9 EQU 0
        MULTWEAK ??OSTimeDly??rA
        MULTWEAK ??OSTimeDlyHMSM??rA
        MULTWEAK ??OSTimeDlyResume??rA
        MULTWEAK ??OSTimeGet??rA
        MULTWEAK ??OSTimeSet??rA
        MULTWEAK ??OS_CPU_SR_Restore??rT
        MULTWEAK ??OS_CPU_SR_Save??rT
        MULTWEAK ??OS_Sched??rT
        MULTWEAK ??rT??divu32_t
        PUBLIC OSTimeDly
        FUNCTION OSTimeDly,0203H
        LOCFRAME CSTACK, 16, STACK
        PUBLIC OSTimeDlyHMSM
        FUNCTION OSTimeDlyHMSM,0203H
        LOCFRAME CSTACK, 8, STACK
        PUBLIC OSTimeDlyResume
        FUNCTION OSTimeDlyResume,0203H
        LOCFRAME CSTACK, 12, STACK
        PUBLIC OSTimeGet
        FUNCTION OSTimeGet,0203H
        LOCFRAME CSTACK, 8, STACK
        PUBLIC OSTimeSet
        FUNCTION OSTimeSet,0203H
        LOCFRAME CSTACK, 8, STACK
        
        CFI Names cfiNames0
        CFI StackFrame CFA R13 HUGEDATA
        CFI Resource R0:32, R1:32, R2:32, R3:32, R4:32, R5:32, R6:32, R7:32
        CFI Resource R8:32, R9:32, R10:32, R11:32, R12:32, CPSR:32, R13:32
        CFI Resource R14:32, SPSR:32
        CFI VirtualResource ?RET:32
        CFI EndNames cfiNames0
        
        CFI Common cfiCommon0 Using cfiNames0
        CFI CodeAlign 4
        CFI DataAlign 4
        CFI ReturnAddress ?RET CODE
        CFI CFA R13+0
        CFI R0 Undefined
        CFI R1 Undefined
        CFI R2 Undefined
        CFI R3 Undefined
        CFI R4 SameValue
        CFI R5 SameValue
        CFI R6 SameValue
        CFI R7 SameValue
        CFI R8 SameValue
        CFI R9 SameValue
        CFI R10 SameValue
        CFI R11 SameValue
        CFI R12 Undefined
        CFI CPSR SameValue
        CFI R14 Undefined
        CFI SPSR SameValue
        CFI ?RET R14
        CFI EndCommon cfiCommon0
        
        
        CFI Common cfiCommon1 Using cfiNames0
        CFI CodeAlign 2
        CFI DataAlign 4
        CFI ReturnAddress ?RET CODE
        CFI CFA R13+0
        CFI R0 Undefined
        CFI R1 Undefined
        CFI R2 Undefined
        CFI R3 Undefined
        CFI R4 SameValue
        CFI R5 SameValue
        CFI R6 SameValue
        CFI R7 SameValue
        CFI R8 SameValue
        CFI R9 SameValue
        CFI R10 SameValue
        CFI R11 SameValue
        CFI R12 Undefined
        CFI CPSR SameValue
        CFI R14 Undefined
        CFI SPSR SameValue
        CFI ?RET R14
        CFI EndCommon cfiCommon1
        
OS_CPU_SR_Restore   SYMBOL "OS_CPU_SR_Restore"
OS_CPU_SR_Save      SYMBOL "OS_CPU_SR_Save"
OS_Sched            SYMBOL "OS_Sched"
OSTimeDly           SYMBOL "OSTimeDly"
??OSTimeDly??rA     SYMBOL "??rA", OSTimeDly
OSTimeDlyHMSM       SYMBOL "OSTimeDlyHMSM"
??OSTimeDlyHMSM??rA SYMBOL "??rA", OSTimeDlyHMSM
OSTimeDlyResume     SYMBOL "OSTimeDlyResume"
??OSTimeDlyResume??rA SYMBOL "??rA", OSTimeDlyResume
OSTimeGet           SYMBOL "OSTimeGet"
??OSTimeGet??rA     SYMBOL "??rA", OSTimeGet
OSTimeSet           SYMBOL "OSTimeSet"
??OSTimeSet??rA     SYMBOL "??rA", OSTimeSet
??OS_CPU_SR_Restore??rT SYMBOL "??rT", OS_CPU_SR_Restore
??OS_CPU_SR_Save??rT SYMBOL "??rT", OS_CPU_SR_Save
??OS_Sched??rT      SYMBOL "??rT", OS_Sched

        EXTERN OSRdyGrp
        EXTERN OSRdyTbl
        EXTERN OSTCBCur
        EXTERN OSTCBPrioTbl
        EXTERN OSTime
        EXTERN OS_CPU_SR_Restore
        FUNCTION OS_CPU_SR_Restore,0202H
        EXTERN OS_CPU_SR_Save
        FUNCTION OS_CPU_SR_Save,0202H
        EXTERN OS_Sched
        FUNCTION OS_Sched,0202H


        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock0 Using cfiCommon0
        CFI NoFunction
        ARM
??OSTimeDly??rA:
        ADD      R12,PC,#+1
        BX       R12
        CFI EndBlock cfiBlock0
        REQUIRE OSTimeDly
// E:\Project\ucos-ii\spi\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 

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock1 Using cfiCommon1
        CFI Function OSTimeDly
        THUMB
//   35 void  OSTimeDly (INT16U ticks)
//   36 {
OSTimeDly:
        PUSH     {R4-R6,LR}
        CFI ?RET Frame(CFA, -4)
        CFI R6 Frame(CFA, -8)
        CFI R5 Frame(CFA, -12)
        CFI R4 Frame(CFA, -16)
        CFI CFA R13+16
        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!                                  */
        BEQ      ??OSTimeDly_0
//   44         OS_ENTER_CRITICAL();
        _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
//   45         y            =  OSTCBCur->OSTCBY;        /* Delay current task                                 */
        LDR      R1,??OSTimeDly_1  ;; OSTCBCur
        LDR      R1,[R1, #+0]
        ADDS     R1,R1,#+47
        LDRB     R1,[R1, #+0]
//   46         OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
        LDR      R3,??DataTable8  ;; OSRdyTbl
        LDR      R6,??DataTable8  ;; OSRdyTbl
        LDRB     R5,[R6, R1]
        LDR      R6,??OSTimeDly_1  ;; OSTCBCur
        LDR      R6,[R6, #+0]
        ADDS     R6,R6,#+48
        LDRB     R6,[R6, #+0]
        BICS     R5,R5,R6
        STRB     R5,[R3, R1]
//   47         if (OSRdyTbl[y] == 0) {  
        LDR      R2,??DataTable8  ;; OSRdyTbl
        LDRB     R1,[R2, R1]
        CMP      R1,#+0
        BNE      ??OSTimeDly_2
//   48             OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
        LDR      R1,??DataTable6  ;; OSRdyGrp
        LDR      R2,??DataTable6  ;; OSRdyGrp
        LDRB     R2,[R2, #+0]
        LDR      R3,??OSTimeDly_1  ;; OSTCBCur
        LDR      R3,[R3, #+0]
        ADDS     R3,R3,#+49
        LDRB     R3,[R3, #+0]
        BICS     R2,R2,R3
        STRB     R2,[R1, #+0]
//   49         }
//   50         OSTCBCur->OSTCBDly = ticks;              /* Load ticks in TCB                                  */
??OSTimeDly_2:
        LDR      R1,??OSTimeDly_1  ;; OSTCBCur
        LDR      R1,[R1, #+0]
        STRH     R4,[R1, #+42]
//   51         OS_EXIT_CRITICAL();
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//   52         OS_Sched();                              /* Find next task to run!                             */
        _BLF     OS_Sched,??OS_Sched??rT
//   53     }
//   54 }
??OSTimeDly_0:
        POP      {R4-R6}
        POP      {R0}
        BX       R0               ;; return
        Nop      
        DATA
??OSTimeDly_1:
        DC32     OSTCBCur
        CFI EndBlock cfiBlock1

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock2 Using cfiCommon0
        CFI NoFunction
        ARM
??OSTimeDlyHMSM??rA:
        ADD      R12,PC,#+1
        BX       R12
        CFI EndBlock cfiBlock2
        REQUIRE OSTimeDlyHMSM
//   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

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock3 Using cfiCommon1
        CFI Function OSTimeDlyHMSM
        THUMB
//   82 INT8U  OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli)
//   83 {
OSTimeDlyHMSM:
        PUSH     {R4,LR}
        CFI ?RET Frame(CFA, -4)
        CFI R4 Frame(CFA, -8)
        CFI CFA R13+8
//   84     INT32U ticks;
//   85     INT16U loops;
//   86 
//   87 
//   88     if (hours == 0) {
        CMP      R0,#+0
        BNE      ??OSTimeDlyHMSM_0
//   89         if (minutes == 0) {
        CMP      R1,#+0
        BNE      ??OSTimeDlyHMSM_0
//   90             if (seconds == 0) {
        CMP      R2,#+0
        BNE      ??OSTimeDlyHMSM_1
//   91                 if (milli == 0) {
        CMP      R3,#+0
        BNE      ??OSTimeDlyHMSM_2
//   92                     return (OS_TIME_ZERO_DLY);
        MOVS     R0,#+84
        B        ??OSTimeDlyHMSM_3
//   93                 }
//   94             }
//   95         }
//   96     }
//   97     if (minutes > 59) {
??OSTimeDlyHMSM_0:
        CMP      R1,#+60
        BCC      ??OSTimeDlyHMSM_1
//   98         return (OS_TIME_INVALID_MINUTES);        /* Validate arguments to be within range              */
        MOVS     R0,#+81
        B        ??OSTimeDlyHMSM_3
//   99     }
//  100     if (seconds > 59) {
??OSTimeDlyHMSM_1:
        CMP      R2,#+60
        BCC      ??OSTimeDlyHMSM_2
//  101         return (OS_TIME_INVALID_SECONDS);
        MOVS     R0,#+82
        B        ??OSTimeDlyHMSM_3
//  102     }
//  103     if (milli > 999) {
??OSTimeDlyHMSM_2:
        MOVS     R4,#+250
        LSLS     R4,R4,#+2        ;; #+1000
        CMP      R3,R4
        BCC      ??OSTimeDlyHMSM_4
//  104         return (OS_TIME_INVALID_MILLI);
        MOVS     R0,#+83
        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:

⌨️ 快捷键说明

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