📄 os_tmr.txt
字号:
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 + -