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

📄 os_tmr.txt

📁 ucos2 is a file system for embedded applications which can be used on any media, for which you can p
💻 TXT
📖 第 1 页 / 共 4 页
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 919] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\rvmdk\os_tmr.o --depend=.\rvmdk\os_tmr.d --device=DARMP --apcs=interwork -I. -I..\BSP -I..\..\..\..\..\uCOS-II\Ports\ARM\Generic\RealView -I..\..\..\..\..\uCOS-II\Source -I..\..\..\..\..\uCOSView\Source -I..\..\..\..\..\uCOSView\Ports\ARM7\LPC2000\IAR -I..\..\..\..\..\uC-CPU -I..\..\..\..\..\uC-CPU\ARM\RealView -I..\..\..\..\..\uC-LIB -I..\..\..\..\..\uC-Probe\Target\Plugins\uCOS-II -IC:\Keil\ARM\INC\Philips --omf_browse=.\rvmdk\os_tmr.crf ..\..\..\..\..\uCOS-II\Source\os_tmr.c]
                          ARM

                          AREA ||.text||, CODE, READONLY, ALIGN=2

                  OSTmrCreate PROC
;;;119                          INT8U           *perr)
;;;120    {
000000  e92d5ff0          PUSH     {r4-r12,lr}
000004  e1a08000          MOV      r8,r0
;;;121        OS_TMR   *ptmr;
;;;122    #if OS_TMR_CFG_NAME_SIZE > 0
;;;123        INT8U     len;
;;;124    #endif
;;;125    
;;;126    
;;;127    #if OS_ARG_CHK_EN > 0
;;;128        if (perr == (INT8U *)0) {                               /* Validate arguments                                     */
;;;129            return ((OS_TMR *)0);
;;;130        }
;;;131        switch (opt) {
;;;132            case OS_TMR_OPT_PERIODIC:
;;;133                 if (period == 0) {
;;;134                     *perr = OS_ERR_TMR_INVALID_PERIOD;
;;;135                     return ((OS_TMR *)0);
;;;136                 }
;;;137                 break;
;;;138    
;;;139            case OS_TMR_OPT_ONE_SHOT:
;;;140                 if (dly == 0) {
;;;141                     *perr = OS_ERR_TMR_INVALID_DLY;
;;;142                     return ((OS_TMR *)0);
;;;143                 }
;;;144                 break;
;;;145    
;;;146            default:
;;;147                 *perr = OS_ERR_TMR_INVALID_OPT;
;;;148                 return ((OS_TMR *)0);
;;;149        }
;;;150    #endif
;;;151        if (OSIntNesting > 0) {                                 /* See if trying to call from an ISR                      */
000008  e59f08bc          LDR      r0,|L1.2252|
00000c  e59d5030          LDR      r5,[sp,#0x30]
000010  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000014  e1a09001          MOV      r9,r1                 ;120
000018  e1a0a002          MOV      r10,r2                ;120
00001c  e3500000          CMP      r0,#0
000020  e1a0b003          MOV      r11,r3                ;120
;;;152            *perr  = OS_ERR_TMR_ISR;
000024  13a0008b          MOVNE    r0,#0x8b
;;;153            return ((OS_TMR *)0);
000028  1a000018          BNE      |L1.144|
;;;154        }
;;;155        OSTmr_Lock();
00002c  ebfffffe          BL       OSTmr_Lock
000030  e59f0898          LDR      r0,|L1.2256|
000034  e3a06000          MOV      r6,#0
000038  e5904000          LDR      r4,[r0,#0]  ; OSTmrFreeList
00003c  e3540000          CMP      r4,#0
000040  01a04006          MOVEQ    r4,r6
000044  0a00000b          BEQ      |L1.120|
000048  e594100c          LDR      r1,[r4,#0xc]
00004c  e5801000          STR      r1,[r0,#0]  ; OSTmrFreeList
000050  e59f087c          LDR      r0,|L1.2260|
000054  e584600c          STR      r6,[r4,#0xc]
000058  e5846010          STR      r6,[r4,#0x10]
00005c  e1d010b0          LDRH     r1,[r0,#0]  ; OSTmrUsed
000060  e2811001          ADD      r1,r1,#1
000064  e1c010b0          STRH     r1,[r0,#0]  ; OSTmrUsed
000068  e59f0868          LDR      r0,|L1.2264|
00006c  e1d010b0          LDRH     r1,[r0,#0]  ; OSTmrFree
000070  e2411001          SUB      r1,r1,#1
000074  e1c010b0          STRH     r1,[r0,#0]  ; OSTmrFree
                  |L1.120|
000078  e59f785c          LDR      r7,|L1.2268|
;;;156        ptmr = OSTmr_Alloc();                                   /* Obtain a timer from the free pool                      */
;;;157        if (ptmr == (OS_TMR *)0) {
00007c  e3540000          CMP      r4,#0
000080  1a000006          BNE      |L1.160|
000084  e5970000          LDR      r0,[r7,#0]  ; OSTmrSem
000088  ebfffffe          BL       OSSemPost
;;;158            OSTmr_Unlock();
;;;159            *perr = OS_ERR_TMR_NON_AVAIL;
00008c  e3a00086          MOV      r0,#0x86
                  |L1.144|
000090  e5c50000          STRB     r0,[r5,#0]
;;;160            return ((OS_TMR *)0);
000094  e3a00000          MOV      r0,#0
                  |L1.152|
000098  e8bd5ff0          POP      {r4-r12,lr}
;;;161        }
;;;162        ptmr->OSTmrState       = OS_TMR_STATE_STOPPED;          /* Indicate that timer is not running yet                 */
;;;163        ptmr->OSTmrDly         = dly;
;;;164        ptmr->OSTmrPeriod      = period;
;;;165        ptmr->OSTmrOpt         = opt;
;;;166        ptmr->OSTmrCallback    = callback;
;;;167        ptmr->OSTmrCallbackArg = callback_arg;
;;;168    #if OS_TMR_CFG_NAME_SIZE > 0
;;;169        if (pname !=(INT8U *)0) {
;;;170            len = OS_StrLen(pname);                             /* Copy timer name                                        */
;;;171            if (len < OS_TMR_CFG_NAME_SIZE) {
;;;172                (void)OS_StrCopy(ptmr->OSTmrName, pname);
;;;173            } else {
;;;174    #if OS_TMR_CFG_NAME_SIZE > 1
;;;175                ptmr->OSTmrName[0] = '#';                       /* Invalid size specified                                 */
;;;176                ptmr->OSTmrName[1] = OS_ASCII_NUL;
;;;177    #endif
;;;178                *perr              = OS_ERR_TMR_NAME_TOO_LONG;
;;;179                OSTmr_Unlock();
;;;180                return (ptmr);
;;;181            }
;;;182        }
;;;183    #endif
;;;184        OSTmr_Unlock();
;;;185        *perr = OS_ERR_NONE;
;;;186        return (ptmr);
;;;187    }
00009c  e12fff1e          BX       lr
                  |L1.160|
0000a0  e3a00001          MOV      r0,#1                 ;162
0000a4  e5c40031          STRB     r0,[r4,#0x31]         ;162
0000a8  e2840018          ADD      r0,r4,#0x18           ;164
0000ac  e8800300          STM      r0,{r8,r9}            ;164
0000b0  e5c4a030          STRB     r10,[r4,#0x30]        ;165
0000b4  e584b004          STR      r11,[r4,#4]           ;167
0000b8  e59d0028          LDR      r0,[sp,#0x28]         ;167
0000bc  e5840008          STR      r0,[r4,#8]            ;169
0000c0  e59d002c          LDR      r0,[sp,#0x2c]         ;169
0000c4  e3500000          CMP      r0,#0                 ;169
0000c8  0a000005          BEQ      |L1.228|
0000cc  ebfffffe          BL       OS_StrLen
0000d0  e3500010          CMP      r0,#0x10              ;171
0000d4  2a000006          BCS      |L1.244|
0000d8  e59d102c          LDR      r1,[sp,#0x2c]         ;172
0000dc  e2840020          ADD      r0,r4,#0x20           ;172
0000e0  ebfffffe          BL       OS_StrCopy
                  |L1.228|
0000e4  e5970000          LDR      r0,[r7,#0]            ;172  ; OSTmrSem
0000e8  ebfffffe          BL       OSSemPost
0000ec  e5c56000          STRB     r6,[r5,#0]            ;185
0000f0  ea000006          B        |L1.272|
                  |L1.244|
0000f4  e3a00023          MOV      r0,#0x23              ;175
0000f8  e5c40020          STRB     r0,[r4,#0x20]         ;175
0000fc  e3a0008c          MOV      r0,#0x8c              ;178
000100  e5c46021          STRB     r6,[r4,#0x21]         ;176
000104  e5c50000          STRB     r0,[r5,#0]            ;178
000108  e5970000          LDR      r0,[r7,#0]            ;178  ; OSTmrSem
00010c  ebfffffe          BL       OSSemPost
                  |L1.272|
000110  e1a00004          MOV      r0,r4                 ;186
000114  eaffffdf          B        |L1.152|
;;;188    #endif
                          ENDP

                  OSTmr_Free PROC
;;;768    {
;;;769        ptmr->OSTmrState       = OS_TMR_STATE_UNUSED;      /* Clear timer object fields                                   */
000118  e3a01000          MOV      r1,#0
00011c  e5c01031          STRB     r1,[r0,#0x31]
;;;770        ptmr->OSTmrOpt         = OS_TMR_OPT_NONE;
000120  e5c01030          STRB     r1,[r0,#0x30]
;;;771        ptmr->OSTmrPeriod      = 0;
;;;772        ptmr->OSTmrMatch       = 0;
000124  e580101c          STR      r1,[r0,#0x1c]
;;;773        ptmr->OSTmrCallback    = (OS_TMR_CALLBACK)0;
000128  e5801014          STR      r1,[r0,#0x14]
;;;774        ptmr->OSTmrCallbackArg = (void *)0;
00012c  e5801004          STR      r1,[r0,#4]
;;;775    #if OS_TMR_CFG_NAME_SIZE > 1
;;;776        ptmr->OSTmrName[0]     = '?';                      /* Unknown name                                                */
000130  e3a0203f          MOV      r2,#0x3f
000134  e5801008          STR      r1,[r0,#8]
000138  e5c02020          STRB     r2,[r0,#0x20]
;;;777        ptmr->OSTmrName[1]     = OS_ASCII_NUL;
00013c  e5c01021          STRB     r1,[r0,#0x21]
;;;778    #endif
;;;779    
;;;780        ptmr->OSTmrPrev        = (OS_TCB *)0;              /* Chain timer to free list                                    */
000140  e5801010          STR      r1,[r0,#0x10]
;;;781        ptmr->OSTmrNext        = OSTmrFreeList;
000144  e59f1784          LDR      r1,|L1.2256|
000148  e5912000          LDR      r2,[r1,#0]  ; OSTmrFreeList
;;;782        OSTmrFreeList          = ptmr;
00014c  e580200c          STR      r2,[r0,#0xc]
000150  e5810000          STR      r0,[r1,#0]  ; OSTmrFreeList
;;;783    
;;;784        OSTmrUsed--;                                       /* Update timer object statistics                              */
000154  e59f0778          LDR      r0,|L1.2260|
000158  e1d010b0          LDRH     r1,[r0,#0]  ; OSTmrUsed
00015c  e2411001          SUB      r1,r1,#1
000160  e1c010b0          STRH     r1,[r0,#0]  ; OSTmrUsed
;;;785        OSTmrFree++;
000164  e59f076c          LDR      r0,|L1.2264|
000168  e1d010b0          LDRH     r1,[r0,#0]  ; OSTmrFree
00016c  e2811001          ADD      r1,r1,#1
000170  e1c010b0          STRH     r1,[r0,#0]  ; OSTmrFree
;;;786    }
000174  e12fff1e          BX       lr
;;;787    #endif
                          ENDP

                  OSTmr_Unlink PROC
;;;1006   
;;;1007       spoke  = (INT16U)(ptmr->OSTmrMatch % OS_TMR_CFG_WHEEL_SIZE);
000178  e5901014          LDR      r1,[r0,#0x14]
;;;1008       pspoke = &OSTmrWheelTbl[spoke];
00017c  e59f275c          LDR      r2,|L1.2272|
000180  e2011007          AND      r1,r1,#7              ;1007
000184  e0821181          ADD      r1,r2,r1,LSL #3
;;;1009   
;;;1010       if (pspoke->OSTmrFirst == ptmr) {                       /* See if timer to remove is at the beginning of list     */
000188  e5913000          LDR      r3,[r1,#0]
00018c  e590200c          LDR      r2,[r0,#0xc]
000190  e1530000          CMP      r3,r0
000194  e3a0c000          MOV      r12,#0
000198  1a000003          BNE      |L1.428|
;;;1011           ptmr1              = (OS_TMR *)ptmr->OSTmrNext;
;;;1012           pspoke->OSTmrFirst = (void *)ptmr1;
;;;1013           if (ptmr1 != (OS_TMR *)0) {
00019c  e3520000          CMP      r2,#0
0001a0  e5812000          STR      r2,[r1,#0]            ;1012
;;;1014               ptmr1->OSTmrPrev = (void *)0;
0001a4  1582c010          STRNE    r12,[r2,#0x10]
0001a8  ea000003          B        |L1.444|
                  |L1.428|
;;;1015           }
;;;1016       } else {
;;;1017           ptmr1            = (OS_TMR *)ptmr->OSTmrPrev;       /* Remove timer from somewhere in the list                */
;;;1018           ptmr2            = (OS_TMR *)ptmr->OSTmrNext;
;;;1019           ptmr1->OSTmrNext = ptmr2;
0001ac  e5903010          LDR      r3,[r0,#0x10]
;;;1020           if (ptmr2 != (OS_TMR *)0) {
0001b0  e3520000          CMP      r2,#0
0001b4  e583200c          STR      r2,[r3,#0xc]          ;1019
;;;1021               ptmr2->OSTmrPrev = (void *)ptmr1;
0001b8  15823010          STRNE    r3,[r2,#0x10]
                  |L1.444|
;;;1022           }
;;;1023       }
;;;1024       ptmr->OSTmrState = OS_TMR_STATE_STOPPED;
0001bc  e3a02001          MOV      r2,#1
0001c0  e5c02031          STRB     r2,[r0,#0x31]
;;;1025       ptmr->OSTmrNext  = (void *)0;
;;;1026       ptmr->OSTmrPrev  = (void *)0;
0001c4  e580c00c          STR      r12,[r0,#0xc]
0001c8  e580c010          STR      r12,[r0,#0x10]
;;;1027       pspoke->OSTmrEntries--;
0001cc  e1d100b4          LDRH     r0,[r1,#4]
0001d0  e2400001          SUB      r0,r0,#1
0001d4  e1c100b4          STRH     r0,[r1,#4]
;;;1028   }
0001d8  e12fff1e          BX       lr
;;;1029   #endif
                          ENDP

                  OSTmrDel PROC
;;;214                       INT8U   *perr)
;;;215    {
0001dc  e92d41f0          PUSH     {r4-r8,lr}
0001e0  e1a06000          MOV      r6,r0
;;;216    #if OS_ARG_CHK_EN > 0
;;;217        if (perr == (INT8U *)0) {                               /* Validate arguments                                     */
;;;218            return (OS_FALSE);
;;;219        }
;;;220        if (ptmr == (OS_TMR *)0) {
;;;221            *perr = OS_ERR_TMR_INVALID;
;;;222            return (OS_FALSE);
;;;223        }
;;;224    #endif
;;;225        if (ptmr->OSTmrType != OS_TMR_TYPE) {                   /* Validate timer structure                               */
0001e4  e5d00000          LDRB     r0,[r0,#0]
0001e8  e1a04001          MOV      r4,r1                 ;215
0001ec  e3500064          CMP      r0,#0x64
;;;226            *perr = OS_ERR_TMR_INVALID_TYPE;
0001f0  13a00089          MOVNE    r0,#0x89
;;;227            return (OS_FALSE);
0001f4  1a00001c          BNE      |L1.620|
;;;228        }
;;;229        if (OSIntNesting > 0) {                                 /* See if trying to call from an ISR                      */
0001f8  e59f06cc          LDR      r0,|L1.2252|
0001fc  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000200  e3500000          CMP      r0,#0
;;;230            *perr  = OS_ERR_TMR_ISR;
000204  13a0008b          MOVNE    r0,#0x8b
;;;231            return (OS_FALSE);
000208  1a000017          BNE      |L1.620|
;;;232        }
;;;233        OSTmr_Lock();
00020c  ebfffffe          BL       OSTmr_Lock
;;;234        switch (ptmr->OSTmrState) {
000210  e5d60031          LDRB     r0,[r6,#0x31]
000214  e59f56c0          LDR      r5,|L1.2268|
000218  e3500000          CMP      r0,#0
00021c  0a00000f          BEQ      |L1.608|
000220  e3500001          CMP      r0,#1
000224  13500002          CMPNE    r0,#2
000228  e3a07000          MOV      r7,#0
00022c  0a000003          BEQ      |L1.576|
000230  e3500003          CMP      r0,#3
000234  1a00000f          BNE      |L1.632|
;;;235            case OS_TMR_STATE_RUNNING:
;;;236                 OSTmr_Unlink(ptmr);                            /* Remove from current wheel spoke                        */
000238  e1a00006          MOV      r0,r6
00023c  ebfffffe          BL       OSTmr_Unlink
                  |L1.576|
;;;237                 OSTmr_Free(ptmr);                              /* Return timer to free list of timers                    */
;;;238                 OSTmr_Unlock();
;;;239                 *perr = OS_ERR_NONE;
;;;240                 return (OS_TRUE);
;;;241    
;;;242            case OS_TMR_STATE_STOPPED:                          /* Timer has not started or ...                           */
;;;243            case OS_TMR_STATE_COMPLETED:                        /* ... timer has completed the ONE-SHOT time              */
;;;244                 OSTmr_Free(ptmr);                              /* Return timer to free list of timers                    */
000240  e1a00006          MOV      r0,r6

⌨️ 快捷键说明

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