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

📄 os_tmr.txt

📁 IARSOURCECODE是基于LPC2478嵌入式软件IAR EWARM V4.42的应用实例代码
💻 TXT
📖 第 1 页 / 共 5 页
字号:
000718  e3550000          CMP      r5,#0
00071c  0a000006          BEQ      |L1.1852|
000720  e3550001          CMP      r5,#1
000724  0a000006          BEQ      |L1.1860|
000728  e3550002          CMP      r5,#2
00072c  0a000005          BEQ      |L1.1864|
000730  e3550003          CMP      r5,#3
000734  1a000007          BNE      |L1.1880|
000738  ea000003          B        |L1.1868|
                  |L1.1852|
00073c  e1a00000          MOV      r0,r0
000740  e1a00000          MOV      r0,r0
                  |L1.1860|
000744  e1a00000          MOV      r0,r0
                  |L1.1864|
000748  e1a00000          MOV      r0,r0
                  |L1.1868|
00074c  e3a00000          MOV      r0,#0
000750  e5c60000          STRB     r0,[r6,#0]
000754  ea000003          B        |L1.1896|
                  |L1.1880|
000758  e1a00000          MOV      r0,r0
00075c  e3a0008d          MOV      r0,#0x8d
000760  e5c60000          STRB     r0,[r6,#0]
000764  e1a00000          MOV      r0,r0
                  |L1.1896|
000768  e1a00000          MOV      r0,r0
00076c  ebfffffe          BL       OSTmr_Unlock
000770  e1a00005          MOV      r0,r5
000774  eaffffce          B        |L1.1716|
                          ENDP

                  OSTmr_Link PROC
;;;955    static  void  OSTmr_Link (OS_TMR *ptmr, INT8U type)
;;;956    {
000778  e92d4010          PUSH     {r4,lr}
;;;957        OS_TMR       *ptmr1;
;;;958        OS_TMR_WHEEL *pspoke;
;;;959        INT16U        spoke;
;;;960    
;;;961    
;;;962        ptmr->OSTmrState = OS_TMR_STATE_RUNNING;
00077c  e3a0e003          MOV      lr,#3
000780  e5c0e031          STRB     lr,[r0,#0x31]
;;;963        if (type == OS_TMR_LINK_PERIODIC) {                            /* Determine when timer will expire                */
000784  e3510001          CMP      r1,#1
000788  1a000005          BNE      |L1.1956|
;;;964            ptmr->OSTmrMatch = ptmr->OSTmrPeriod + OSTmrTime;
00078c  e59f45ec          LDR      r4,|L1.3456|
000790  e590e01c          LDR      lr,[r0,#0x1c]
000794  e5944000          LDR      r4,[r4,#0]  ; OSTmrTime
000798  e08ee004          ADD      lr,lr,r4
00079c  e580e014          STR      lr,[r0,#0x14]
0007a0  ea00000d          B        |L1.2012|
                  |L1.1956|
;;;965        } else {
;;;966            if (ptmr->OSTmrDly == 0) {
0007a4  e590e018          LDR      lr,[r0,#0x18]
0007a8  e35e0000          CMP      lr,#0
0007ac  1a000005          BNE      |L1.1992|
;;;967                ptmr->OSTmrMatch = ptmr->OSTmrPeriod + OSTmrTime;
0007b0  e59f45c8          LDR      r4,|L1.3456|
0007b4  e590e01c          LDR      lr,[r0,#0x1c]
0007b8  e5944000          LDR      r4,[r4,#0]  ; OSTmrTime
0007bc  e08ee004          ADD      lr,lr,r4
0007c0  e580e014          STR      lr,[r0,#0x14]
0007c4  ea000004          B        |L1.2012|
                  |L1.1992|
;;;968            } else {
;;;969                ptmr->OSTmrMatch = ptmr->OSTmrDly    + OSTmrTime;
0007c8  e59f45b0          LDR      r4,|L1.3456|
0007cc  e590e018          LDR      lr,[r0,#0x18]
0007d0  e5944000          LDR      r4,[r4,#0]  ; OSTmrTime
0007d4  e08ee004          ADD      lr,lr,r4
0007d8  e580e014          STR      lr,[r0,#0x14]
                  |L1.2012|
;;;970            }
;;;971        }
;;;972        spoke  = (INT16U)(ptmr->OSTmrMatch % OS_TMR_CFG_WHEEL_SIZE);
0007dc  e590e014          LDR      lr,[r0,#0x14]
0007e0  e20e3007          AND      r3,lr,#7
;;;973        pspoke = &OSTmrWheelTbl[spoke];
0007e4  e59fe590          LDR      lr,|L1.3452|
0007e8  e08ec183          ADD      r12,lr,r3,LSL #3
;;;974    
;;;975        if (pspoke->OSTmrFirst == (OS_TMR *)0) {                       /* Link into timer wheel                           */
0007ec  e59ce000          LDR      lr,[r12,#0]
0007f0  e35e0000          CMP      lr,#0
0007f4  1a000005          BNE      |L1.2064|
;;;976            pspoke->OSTmrFirst   = ptmr;
0007f8  e58c0000          STR      r0,[r12,#0]
;;;977            ptmr->OSTmrNext      = (OS_TMR *)0;
0007fc  e3a0e000          MOV      lr,#0
000800  e580e00c          STR      lr,[r0,#0xc]
;;;978            pspoke->OSTmrEntries = 1;
000804  e3a0e001          MOV      lr,#1
000808  e1cce0b4          STRH     lr,[r12,#4]
00080c  ea000007          B        |L1.2096|
                  |L1.2064|
;;;979        } else {
;;;980            ptmr1                = pspoke->OSTmrFirst;                 /* Point to first timer in the spoke               */
000810  e59c2000          LDR      r2,[r12,#0]
;;;981            pspoke->OSTmrFirst   = ptmr;
000814  e58c0000          STR      r0,[r12,#0]
;;;982            ptmr->OSTmrNext      = (void *)ptmr1;
000818  e580200c          STR      r2,[r0,#0xc]
;;;983            ptmr1->OSTmrPrev     = (void *)ptmr;
00081c  e5820010          STR      r0,[r2,#0x10]
;;;984            pspoke->OSTmrEntries++;
000820  e1dce0b4          LDRH     lr,[r12,#4]
000824  e28ee001          ADD      lr,lr,#1
000828  e3cee801          BIC      lr,lr,#0x10000
00082c  e1cce0b4          STRH     lr,[r12,#4]
                  |L1.2096|
;;;985        }
;;;986        ptmr->OSTmrPrev = (void *)0;                                   /* Timer always inserted as first node in list     */
000830  e3a0e000          MOV      lr,#0
000834  e580e010          STR      lr,[r0,#0x10]
;;;987    }
000838  e8bd4010          POP      {r4,lr}
00083c  e12fff1e          BX       lr
                          ENDP

                  OSTmrStart PROC
;;;526                         INT8U    *perr)
;;;527    {
000840  e92d4070          PUSH     {r4-r6,lr}
000844  e1a05000          MOV      r5,r0
000848  e1a04001          MOV      r4,r1
;;;528    #if OS_ARG_CHK_EN > 0
;;;529        if (perr == (INT8U *)0) {                               /* Validate arguments                                     */
00084c  e3540000          CMP      r4,#0
000850  1a000002          BNE      |L1.2144|
;;;530            return (OS_FALSE);
000854  e3a00000          MOV      r0,#0
                  |L1.2136|
000858  e8bd4070          POP      {r4-r6,lr}
;;;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                               */
;;;538            *perr = OS_ERR_TMR_INVALID_TYPE;
;;;539            return (OS_FALSE);
;;;540        }
;;;541        if (OSIntNesting > 0) {                                 /* See if trying to call from an ISR                      */
;;;542            *perr  = OS_ERR_TMR_ISR;
;;;543            return (OS_FALSE);
;;;544        }
;;;545        OSTmr_Lock();
;;;546        switch (ptmr->OSTmrState) {
;;;547            case OS_TMR_STATE_RUNNING:                          /* Restart the timer                                      */
;;;548                 OSTmr_Unlink(ptmr);                            /* ... Stop the timer                                     */
;;;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                          */
;;;557                 OSTmr_Unlock();
;;;558                 *perr = OS_ERR_NONE;
;;;559                 return (OS_TRUE);
;;;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    }
00085c  e12fff1e          BX       lr
                  |L1.2144|
000860  e3550000          CMP      r5,#0
000864  1a000003          BNE      |L1.2168|
000868  e3a0008a          MOV      r0,#0x8a
00086c  e5c40000          STRB     r0,[r4,#0]
000870  e3a00000          MOV      r0,#0
000874  eafffff7          B        |L1.2136|
                  |L1.2168|
000878  e5d50000          LDRB     r0,[r5,#0]
00087c  e3500064          CMP      r0,#0x64
000880  0a000003          BEQ      |L1.2196|
000884  e3a00089          MOV      r0,#0x89
000888  e5c40000          STRB     r0,[r4,#0]
00088c  e3a00000          MOV      r0,#0
000890  eafffff0          B        |L1.2136|
                  |L1.2196|
000894  e59f04dc          LDR      r0,|L1.3448|
000898  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
00089c  e3500000          CMP      r0,#0
0008a0  da000003          BLE      |L1.2228|
0008a4  e3a0008b          MOV      r0,#0x8b
0008a8  e5c40000          STRB     r0,[r4,#0]
0008ac  e3a00000          MOV      r0,#0
0008b0  eaffffe8          B        |L1.2136|
                  |L1.2228|
0008b4  ebfffffe          BL       OSTmr_Lock
0008b8  e5d50031          LDRB     r0,[r5,#0x31]
0008bc  e3500000          CMP      r0,#0
0008c0  0a00001a          BEQ      |L1.2352|
0008c4  e3500001          CMP      r0,#1
0008c8  0a00000e          BEQ      |L1.2312|
0008cc  e3500002          CMP      r0,#2
0008d0  0a00000e          BEQ      |L1.2320|
0008d4  e3500003          CMP      r0,#3
0008d8  1a00001a          BNE      |L1.2376|
0008dc  e1a00000          MOV      r0,r0
0008e0  e1a00005          MOV      r0,r5
0008e4  ebfffffe          BL       OSTmr_Unlink
0008e8  e3a01000          MOV      r1,#0
0008ec  e1a00005          MOV      r0,r5
0008f0  ebfffffe          BL       OSTmr_Link
0008f4  ebfffffe          BL       OSTmr_Unlock
0008f8  e3a00000          MOV      r0,#0
0008fc  e5c40000          STRB     r0,[r4,#0]
000900  e3a00001          MOV      r0,#1
000904  eaffffd3          B        |L1.2136|
                  |L1.2312|
000908  e1a00000          MOV      r0,r0
00090c  e1a00000          MOV      r0,r0
                  |L1.2320|
000910  e3a01000          MOV      r1,#0
000914  e1a00005          MOV      r0,r5
000918  ebfffffe          BL       OSTmr_Link
00091c  ebfffffe          BL       OSTmr_Unlock
000920  e3a00000          MOV      r0,#0
000924  e5c40000          STRB     r0,[r4,#0]
000928  e3a00001          MOV      r0,#1
00092c  eaffffc9          B        |L1.2136|
                  |L1.2352|
000930  e1a00000          MOV      r0,r0
000934  ebfffffe          BL       OSTmr_Unlock
000938  e3a00087          MOV      r0,#0x87
00093c  e5c40000          STRB     r0,[r4,#0]
000940  e3a00000          MOV      r0,#0
000944  eaffffc3          B        |L1.2136|
                  |L1.2376|
000948  e1a00000          MOV      r0,r0
00094c  ebfffffe          BL       OSTmr_Unlock
000950  e3a0008d          MOV      r0,#0x8d
000954  e5c40000          STRB     r0,[r4,#0]
000958  e3a00000          MOV      r0,#0
00095c  eaffffbd          B        |L1.2136|
                          ENDP

                  OSTmrStop PROC
;;;615                        INT8U   *perr)
;;;616    {
000960  e92d41f0          PUSH     {r4-r8,lr}
000964  e1a04000          MOV      r4,r0
000968  e1a05001          MOV      r5,r1
00096c  e1a07002          MOV      r7,r2
000970  e1a08003          MOV      r8,r3
;;;617        OS_TMR_CALLBACK  pfnct;
;;;618    
;;;619    
;;;620    #if OS_ARG_CHK_EN > 0
;;;621        if (perr == (INT8U *)0) {                                     /* Validate arguments                               */
000974  e3580000          CMP      r8,#0
000978  1a000002          BNE      |L1.2440|
;;;622            return (OS_FALSE);
00097c  e3a00000          MOV      r0,#0
                  |L1.2432|
000980  e8bd41f0          POP      {r4-r8,lr}
;;;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                         */
;;;630            *perr = OS_ERR_TMR_INVALID_TYPE;
;;;631            return (OS_FALSE);
;;;632        }
;;;633        if (OSIntNesting > 0) {                                       /* See if trying to call from an ISR                */
;;;634            *perr  = OS_ERR_TMR_ISR;
;;;635            return (OS_FALSE);
;;;636        }
;;;637        OSTmr_Lock();
;;;638        switch (ptmr->OSTmrState) {
;;;639            case OS_TMR_STATE_RUNNING:
;;;640                 OSTmr_Unlink(ptmr);                                  /* Remove from current wheel spoke                  */
;;;641                 *perr = OS_ERR_NONE;
;;;642                 switch (opt) {
;;;643                     case OS_TMR_OPT_CALLBACK:
;;;644                          pfnct = ptmr->OSTmrCallback;                /* Execute callback function if available ...       */

⌨️ 快捷键说明

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