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

📄 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 页
字号:
;;;482        }
;;;483        OSTmr_Lock();
;;;484        state = ptmr->OSTmrState;
;;;485        switch (state) {
;;;486            case OS_TMR_STATE_UNUSED:   
;;;487            case OS_TMR_STATE_STOPPED:  
;;;488            case OS_TMR_STATE_COMPLETED:
;;;489            case OS_TMR_STATE_RUNNING:  
;;;490                 *perr = OS_ERR_NONE;
;;;491                 break;
;;;492                 
;;;493            default:
;;;494                 *perr = OS_ERR_TMR_INVALID_STATE;
;;;495                 break;
;;;496        }
;;;497        OSTmr_Unlock();
;;;498        return (state);
;;;499    }
000460  e12fff1e          BX       lr
                  |L1.1124|
000464  ebfffffe          BL       OSTmr_Lock
000468  e5d44031          LDRB     r4,[r4,#0x31]         ;484
00046c  e3540000          CMP      r4,#0                 ;485
000470  13540001          CMPNE    r4,#1                 ;485
000474  13540002          CMPNE    r4,#2                 ;485
000478  13540003          CMPNE    r4,#3                 ;485
00047c  03a00000          MOVEQ    r0,#0                 ;490
000480  13a0008d          MOVNE    r0,#0x8d              ;494
000484  e5c50000          STRB     r0,[r5,#0]            ;490
000488  e59f044c          LDR      r0,|L1.2268|
00048c  e5900000          LDR      r0,[r0,#0]            ;490  ; OSTmrSem
000490  ebfffffe          BL       OSSemPost
000494  e1a00004          MOV      r0,r4                 ;498
000498  eaffffef          B        |L1.1116|
;;;500    #endif
                          ENDP

                  OSTmr_Link PROC
;;;956    
;;;957        ptmr->OSTmrState = OS_TMR_STATE_RUNNING;
00049c  e3a02003          MOV      r2,#3
0004a0  e5c02031          STRB     r2,[r0,#0x31]
;;;958        if (type == OS_TMR_LINK_PERIODIC) {                            /* Determine when timer will expire                */
0004a4  e3510001          CMP      r1,#1
;;;959            ptmr->OSTmrMatch = ptmr->OSTmrPeriod + OSTmrTime;
;;;960        } else {
;;;961            if (ptmr->OSTmrDly == 0) {
0004a8  15901018          LDRNE    r1,[r0,#0x18]
0004ac  e59f2430          LDR      r2,|L1.2276|
0004b0  13510000          CMPNE    r1,#0
0004b4  e5922000          LDR      r2,[r2,#0]            ;957
0004b8  0590101c          LDREQ    r1,[r0,#0x1c]         ;959
;;;962                ptmr->OSTmrMatch = ptmr->OSTmrPeriod + OSTmrTime;
;;;963            } else {
;;;964                ptmr->OSTmrMatch = ptmr->OSTmrDly    + OSTmrTime;
;;;965            }
;;;966        }
;;;967        spoke  = (INT16U)(ptmr->OSTmrMatch % OS_TMR_CFG_WHEEL_SIZE);
;;;968        pspoke = &OSTmrWheelTbl[spoke];
;;;969    
;;;970        if (pspoke->OSTmrFirst == (OS_TMR *)0) {                       /* Link into timer wheel                           */
0004bc  e3a03000          MOV      r3,#0
0004c0  e0811002          ADD      r1,r1,r2              ;964
0004c4  e59f2414          LDR      r2,|L1.2272|
0004c8  e5801014          STR      r1,[r0,#0x14]         ;964
0004cc  e2011007          AND      r1,r1,#7              ;967
0004d0  e0821181          ADD      r1,r2,r1,LSL #3       ;968
0004d4  e5912000          LDR      r2,[r1,#0]
;;;971            pspoke->OSTmrFirst   = ptmr;
0004d8  e5810000          STR      r0,[r1,#0]
0004dc  e3520000          CMP      r2,#0                 ;970
;;;972            ptmr->OSTmrNext      = (OS_TMR *)0;
;;;973            pspoke->OSTmrEntries = 1;
;;;974        } else {
;;;975            ptmr1                = pspoke->OSTmrFirst;                 /* Point to first timer in the spoke               */
;;;976            pspoke->OSTmrFirst   = ptmr;
;;;977            ptmr->OSTmrNext      = (void *)ptmr1;
;;;978            ptmr1->OSTmrPrev     = (void *)ptmr;
0004e0  1580200c          STRNE    r2,[r0,#0xc]
0004e4  15820010          STRNE    r0,[r2,#0x10]
;;;979            pspoke->OSTmrEntries++;
0004e8  11d120b4          LDRHNE   r2,[r1,#4]
0004ec  0580300c          STREQ    r3,[r0,#0xc]          ;973
0004f0  12822001          ADDNE    r2,r2,#1
0004f4  03a02001          MOVEQ    r2,#1                 ;973
0004f8  e1c120b4          STRH     r2,[r1,#4]
;;;980        }
;;;981        ptmr->OSTmrPrev = (void *)0;                                   /* Timer always inserted as first node in list     */
0004fc  e5803010          STR      r3,[r0,#0x10]
;;;982    }
000500  e12fff1e          BX       lr
;;;983    #endif
                          ENDP

                  OSTmrStart PROC
;;;526                         INT8U    *perr)
;;;527    {
000504  e92d41f0          PUSH     {r4-r8,lr}
000508  e1a06000          MOV      r6,r0
;;;528    #if OS_ARG_CHK_EN > 0
;;;529        if (perr == (INT8U *)0) {                               /* Validate arguments                                     */
;;;530            return (OS_FALSE);
;;;531        }
;;;532        if (ptmr == (OS_TMR *)0) {
;;;533            *perr = OS_ERR_TMR_INVALID;
;;;534            return (OS_FALSE);
;;;535        }
;;;536    #endif
;;;537        if (ptmr->OSTmrType != OS_TMR_TYPE) {                   /* Validate timer structure                               */
00050c  e5d00000          LDRB     r0,[r0,#0]
000510  e1a04001          MOV      r4,r1                 ;527
000514  e3500064          CMP      r0,#0x64
;;;538            *perr = OS_ERR_TMR_INVALID_TYPE;
000518  13a00089          MOVNE    r0,#0x89
;;;539            return (OS_FALSE);
00051c  1a00001d          BNE      |L1.1432|
;;;540        }
;;;541        if (OSIntNesting > 0) {                                 /* See if trying to call from an ISR                      */
000520  e59f03a4          LDR      r0,|L1.2252|
000524  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000528  e3500000          CMP      r0,#0
;;;542            *perr  = OS_ERR_TMR_ISR;
00052c  13a0008b          MOVNE    r0,#0x8b
;;;543            return (OS_FALSE);
000530  1a000018          BNE      |L1.1432|
;;;544        }
;;;545        OSTmr_Lock();
000534  ebfffffe          BL       OSTmr_Lock
;;;546        switch (ptmr->OSTmrState) {
000538  e5d60031          LDRB     r0,[r6,#0x31]
00053c  e59f5398          LDR      r5,|L1.2268|
000540  e3500000          CMP      r0,#0
000544  0a000010          BEQ      |L1.1420|
000548  e3500001          CMP      r0,#1
00054c  13500002          CMPNE    r0,#2
000550  e3a07000          MOV      r7,#0
000554  0a000003          BEQ      |L1.1384|
000558  e3500003          CMP      r0,#3
00055c  1a000010          BNE      |L1.1444|
;;;547            case OS_TMR_STATE_RUNNING:                          /* Restart the timer                                      */
;;;548                 OSTmr_Unlink(ptmr);                            /* ... Stop the timer                                     */
000560  e1a00006          MOV      r0,r6
000564  ebfffffe          BL       OSTmr_Unlink
                  |L1.1384|
;;;549                 OSTmr_Link(ptmr, OS_TMR_LINK_DLY);             /* ... Link timer to timer wheel                          */
;;;550                 OSTmr_Unlock();
;;;551                 *perr = OS_ERR_NONE;
;;;552                 return (OS_TRUE);
;;;553    
;;;554            case OS_TMR_STATE_STOPPED:                          /* Start the timer                                        */
;;;555            case OS_TMR_STATE_COMPLETED:
;;;556                 OSTmr_Link(ptmr, OS_TMR_LINK_DLY);             /* ... Link timer to timer wheel                          */
000568  e3a01000          MOV      r1,#0
00056c  e1a00006          MOV      r0,r6
000570  ebfffffe          BL       OSTmr_Link
000574  e5950000          LDR      r0,[r5,#0]  ; OSTmrSem
000578  ebfffffe          BL       OSSemPost
;;;557                 OSTmr_Unlock();
;;;558                 *perr = OS_ERR_NONE;
;;;559                 return (OS_TRUE);
00057c  e3a00001          MOV      r0,#1
000580  e5c47000          STRB     r7,[r4,#0]            ;558
                  |L1.1412|
000584  e8bd41f0          POP      {r4-r8,lr}
;;;560    
;;;561            case OS_TMR_STATE_UNUSED:                           /* Timer not created                                      */
;;;562                 OSTmr_Unlock();
;;;563                 *perr = OS_ERR_TMR_INACTIVE;
;;;564                 return (OS_FALSE);
;;;565    
;;;566            default:
;;;567                 OSTmr_Unlock();
;;;568                 *perr = OS_ERR_TMR_INVALID_STATE;
;;;569                 return (OS_FALSE);
;;;570        }
;;;571    }
000588  e12fff1e          BX       lr
                  |L1.1420|
00058c  e5950000          LDR      r0,[r5,#0]  ; OSTmrSem
000590  ebfffffe          BL       OSSemPost
000594  e3a00087          MOV      r0,#0x87              ;563
                  |L1.1432|
000598  e5c40000          STRB     r0,[r4,#0]            ;568
00059c  e3a00000          MOV      r0,#0                 ;569
0005a0  eafffff7          B        |L1.1412|
                  |L1.1444|
0005a4  e5950000          LDR      r0,[r5,#0]            ;569  ; OSTmrSem
0005a8  ebfffffe          BL       OSSemPost
0005ac  e3a0008d          MOV      r0,#0x8d              ;568
0005b0  eafffff8          B        |L1.1432|
;;;572    #endif
                          ENDP

                  OSTmrStop PROC
;;;615                        INT8U   *perr)
;;;616    {
0005b4  e92d41f0          PUSH     {r4-r8,lr}
0005b8  e1a05000          MOV      r5,r0
;;;617        OS_TMR_CALLBACK  pfnct;
;;;618    
;;;619    
;;;620    #if OS_ARG_CHK_EN > 0
;;;621        if (perr == (INT8U *)0) {                                     /* Validate arguments                               */
;;;622            return (OS_FALSE);
;;;623        }
;;;624        if (ptmr == (OS_TMR *)0) {
;;;625            *perr = OS_ERR_TMR_INVALID;
;;;626            return (OS_FALSE);
;;;627        }
;;;628    #endif
;;;629        if (ptmr->OSTmrType != OS_TMR_TYPE) {                         /* Validate timer structure                         */
0005bc  e5d00000          LDRB     r0,[r0,#0]
0005c0  e1a06001          MOV      r6,r1                 ;616
0005c4  e1a08002          MOV      r8,r2                 ;616
0005c8  e3500064          CMP      r0,#0x64
0005cc  e1a04003          MOV      r4,r3                 ;616
;;;630            *perr = OS_ERR_TMR_INVALID_TYPE;
0005d0  13a00089          MOVNE    r0,#0x89
;;;631            return (OS_FALSE);
0005d4  1a000034          BNE      |L1.1708|
;;;632        }
;;;633        if (OSIntNesting > 0) {                                       /* See if trying to call from an ISR                */
0005d8  e59f02ec          LDR      r0,|L1.2252|
0005dc  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0005e0  e3500000          CMP      r0,#0
;;;634            *perr  = OS_ERR_TMR_ISR;
0005e4  13a0008b          MOVNE    r0,#0x8b
;;;635            return (OS_FALSE);
0005e8  1a00002f          BNE      |L1.1708|
;;;636        }
;;;637        OSTmr_Lock();
0005ec  ebfffffe          BL       OSTmr_Lock
;;;638        switch (ptmr->OSTmrState) {
0005f0  e5d50031          LDRB     r0,[r5,#0x31]
0005f4  e59f72e0          LDR      r7,|L1.2268|
0005f8  e3500000          CMP      r0,#0
0005fc  0a000027          BEQ      |L1.1696|
000600  e3500001          CMP      r0,#1
000604  13500002          CMPNE    r0,#2
000608  0a00001f          BEQ      |L1.1676|
00060c  e3500003          CMP      r0,#3
000610  1a000028          BNE      |L1.1720|
;;;639            case OS_TMR_STATE_RUNNING:
;;;640                 OSTmr_Unlink(ptmr);                                  /* Remove from current wheel spoke                  */
000614  e1a00005          MOV      r0,r5
000618  ebfffffe          BL       OSTmr_Unlink
;;;641                 *perr = OS_ERR_NONE;
00061c  e3a00000          MOV      r0,#0
;;;642                 switch (opt) {
000620  e3560000          CMP      r6,#0
000624  e5c40000          STRB     r0,[r4,#0]            ;641
000628  0a000012          BEQ      |L1.1656|
00062c  e3560003          CMP      r6,#3
000630  e3a0008f          MOV      r0,#0x8f
000634  0a00000a          BEQ      |L1.1636|
000638  e3560004          CMP      r6,#4
;;;643                     case OS_TMR_OPT_CALLBACK:
;;;644                          pfnct = ptmr->OSTmrCallback;                /* Execute callback function if available ...       */
;;;645                          if (pfnct != (OS_TMR_CALLBACK)0) {
;;;646                              (*pfnct)((void *)ptmr, ptmr->OSTmrCallbackArg);  /* Use callback arg when timer was created */
;;;647                          } else {
;;;648                              *perr = OS_ERR_TMR_NO_CALLBACK;
;;;649                          }
;;;650                          break;
;;;651    
;;;652                     case OS_TMR_OPT_CALLBACK_ARG:
;;;653                          pfnct = ptmr->OSTmrCallback;                /* Execute callback function if available ...       */
;;;654                          if (pfnct != (OS_TMR_CALLBACK)0) {
;;;655                              (*pfnct)((void *)ptmr, callback_arg);   /* ... using the 'callback_arg' provided in call    */
;;;656                          } else {
;;;657                              *perr = OS_ERR_TMR_NO_CALLBACK;
;;;658                          }
;;;659                          break;
;;;660    
;;;661                     case OS_TMR_OPT_NONE:
;;;662                          break;
;;;663    
;;;664                     default:
;;;665                         *perr = OS_ERR_TMR_INVALID_OPT;
00063c  13a00084          MOVNE    r0,#0x84
;;;666                         break;
000640  1a00000b          BNE      |L1.1652|
000644  e5952004          LDR      r2,[r5,#4]            ;653
000648  e3520000          CMP      r2,#0                 ;654
00064c  0a000008          BEQ      |L1.1652|
000650  e1a01008          MOV      r1,r8                 ;655
                  |L1.1620|
000654  e1a00005          MOV      r0,r5                 ;655
000658  e1a0e00f          MOV      lr,pc                 ;655
00065c  e12fff12          BX       r2                    ;655
000660  ea000004          B        |L1.1656|
                  |L1.1636|
000664  e5952004          LDR      r2,[r5,#4]            ;644
000668  e3520000          CMP      r2,#0                 ;645
00066c  15951008          LDRNE    r1,[r5,#8]            ;646
000670  1afffff7          BNE      |L1.1620|
                  |L1.1652|
000674  e5c40000          STRB     r0,[r4,#0]            ;657
                  |L1.1656|
000678  e5970000          LDR      r0,[r7,#0]            ;657  ; OSTmrSem
00067c  ebfffffe          BL       OSSemPost
                  |L1.1664|
;;;667                 }
;;;668                 OSTmr_Unlock();
;;;669                 return (OS_TRUE);
;;;670    
;;;671            case OS_TMR_STATE_COMPLETED:                              /* Timer has already completed the ONE-SHOT or ...  */
;;;672            case OS_TMR_STATE_STOPPED:                                /* ... timer has not started yet.                   */
;;;673                 OSTmr_Unlock();
;;;674                 *perr = OS_ERR_TMR_STOPPED;
;;;675                 return (OS_TRUE);
000680  e3a00001          MOV      r0,#1
                  |L1.1668|
000684  e8bd41f0          POP      {r4-r8,lr}
;;;676    
;;;677            case OS_TMR_STATE_UNUSED:                                 /* Timer was not created                            */

⌨️ 快捷键说明

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