📄 os_tmr.txt
字号:
;;;645 if (pfnct != (OS_TMR_CALLBACK)0) {
;;;646 (*pfnct)((void *)ptmr, ptmr->OSTmrCallbackArg); /* Use callback arg when timer was created */
;;;647 } else {
;;;648 OSTmr_Unlock();
;;;649 *perr = OS_ERR_TMR_NO_CALLBACK;
;;;650 return (OS_FALSE);
;;;651 }
;;;652 break;
;;;653
;;;654 case OS_TMR_OPT_CALLBACK_ARG:
;;;655 pfnct = ptmr->OSTmrCallback; /* Execute callback function if available ... */
;;;656 if (pfnct != (OS_TMR_CALLBACK)0) {
;;;657 (*pfnct)((void *)ptmr, callback_arg); /* ... using the 'callback_arg' provided in call */
;;;658 } else {
;;;659 OSTmr_Unlock();
;;;660 *perr = OS_ERR_TMR_NO_CALLBACK;
;;;661 return (OS_FALSE);
;;;662 }
;;;663 break;
;;;664
;;;665 case OS_TMR_OPT_NONE:
;;;666 break;
;;;667
;;;668 default:
;;;669 OSTmr_Unlock();
;;;670 *perr = OS_ERR_TMR_INVALID_OPT;
;;;671 return (OS_FALSE);
;;;672 }
;;;673 OSTmr_Unlock();
;;;674 return (OS_TRUE);
;;;675
;;;676 case OS_TMR_STATE_COMPLETED: /* Timer has already completed the ONE-SHOT or ... */
;;;677 case OS_TMR_STATE_STOPPED: /* ... timer has not started yet. */
;;;678 OSTmr_Unlock();
;;;679 *perr = OS_ERR_TMR_STOPPED;
;;;680 return (OS_TRUE);
;;;681
;;;682 case OS_TMR_STATE_UNUSED: /* Timer was not created */
;;;683 OSTmr_Unlock();
;;;684 *perr = OS_ERR_TMR_INACTIVE;
;;;685 return (OS_FALSE);
;;;686
;;;687 default:
;;;688 OSTmr_Unlock();
;;;689 *perr = OS_ERR_TMR_INVALID_STATE;
;;;690 return (OS_FALSE);
;;;691 }
;;;692 }
000984 e12fff1e BX lr
|L1.2440|
000988 e3540000 CMP r4,#0
00098c 1a000003 BNE |L1.2464|
000990 e3a0008a MOV r0,#0x8a
000994 e5c80000 STRB r0,[r8,#0]
000998 e3a00000 MOV r0,#0
00099c eafffff7 B |L1.2432|
|L1.2464|
0009a0 e5d40000 LDRB r0,[r4,#0]
0009a4 e3500064 CMP r0,#0x64
0009a8 0a000003 BEQ |L1.2492|
0009ac e3a00089 MOV r0,#0x89
0009b0 e5c80000 STRB r0,[r8,#0]
0009b4 e3a00000 MOV r0,#0
0009b8 eafffff0 B |L1.2432|
|L1.2492|
0009bc e59f03b4 LDR r0,|L1.3448|
0009c0 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0009c4 e3500000 CMP r0,#0
0009c8 da000003 BLE |L1.2524|
0009cc e3a0008b MOV r0,#0x8b
0009d0 e5c80000 STRB r0,[r8,#0]
0009d4 e3a00000 MOV r0,#0
0009d8 eaffffe8 B |L1.2432|
|L1.2524|
0009dc ebfffffe BL OSTmr_Lock
0009e0 e5d40031 LDRB r0,[r4,#0x31]
0009e4 e3500000 CMP r0,#0
0009e8 0a000042 BEQ |L1.2808|
0009ec e3500001 CMP r0,#1
0009f0 0a00003b BEQ |L1.2788|
0009f4 e3500002 CMP r0,#2
0009f8 0a000037 BEQ |L1.2780|
0009fc e3500003 CMP r0,#3
000a00 1a000042 BNE |L1.2832|
000a04 e1a00000 MOV r0,r0
000a08 e1a00004 MOV r0,r4
000a0c ebfffffe BL OSTmr_Unlink
000a10 e3a00000 MOV r0,#0
000a14 e5c80000 STRB r0,[r8,#0]
000a18 e3550000 CMP r5,#0
000a1c 0a000022 BEQ |L1.2732|
000a20 e3550003 CMP r5,#3
000a24 0a000002 BEQ |L1.2612|
000a28 e3550004 CMP r5,#4
000a2c 1a000020 BNE |L1.2740|
000a30 ea00000e B |L1.2672|
|L1.2612|
000a34 e1a00000 MOV r0,r0
000a38 e5946004 LDR r6,[r4,#4]
000a3c e3560000 CMP r6,#0
000a40 0a000004 BEQ |L1.2648|
000a44 e5941008 LDR r1,[r4,#8]
000a48 e1a00004 MOV r0,r4
000a4c e1a0e00f MOV lr,pc
000a50 e12fff16 BX r6
000a54 ea000004 B |L1.2668|
|L1.2648|
000a58 ebfffffe BL OSTmr_Unlock
000a5c e3a0008f MOV r0,#0x8f
000a60 e5c80000 STRB r0,[r8,#0]
000a64 e3a00000 MOV r0,#0
000a68 eaffffc4 B |L1.2432|
|L1.2668|
000a6c ea000016 B |L1.2764|
|L1.2672|
000a70 e1a00000 MOV r0,r0
000a74 e5946004 LDR r6,[r4,#4]
000a78 e3560000 CMP r6,#0
000a7c 0a000004 BEQ |L1.2708|
000a80 e1a01007 MOV r1,r7
000a84 e1a00004 MOV r0,r4
000a88 e1a0e00f MOV lr,pc
000a8c e12fff16 BX r6
000a90 ea000004 B |L1.2728|
|L1.2708|
000a94 ebfffffe BL OSTmr_Unlock
000a98 e3a0008f MOV r0,#0x8f
000a9c e5c80000 STRB r0,[r8,#0]
000aa0 e3a00000 MOV r0,#0
000aa4 eaffffb5 B |L1.2432|
|L1.2728|
000aa8 ea000007 B |L1.2764|
|L1.2732|
000aac e1a00000 MOV r0,r0
000ab0 ea000005 B |L1.2764|
|L1.2740|
000ab4 e1a00000 MOV r0,r0
000ab8 ebfffffe BL OSTmr_Unlock
000abc e3a00084 MOV r0,#0x84
000ac0 e5c80000 STRB r0,[r8,#0]
000ac4 e3a00000 MOV r0,#0
000ac8 eaffffac B |L1.2432|
|L1.2764|
000acc e1a00000 MOV r0,r0
000ad0 ebfffffe BL OSTmr_Unlock
000ad4 e3a00001 MOV r0,#1
000ad8 eaffffa8 B |L1.2432|
|L1.2780|
000adc e1a00000 MOV r0,r0
000ae0 e1a00000 MOV r0,r0
|L1.2788|
000ae4 ebfffffe BL OSTmr_Unlock
000ae8 e3a0008e MOV r0,#0x8e
000aec e5c80000 STRB r0,[r8,#0]
000af0 e3a00001 MOV r0,#1
000af4 eaffffa1 B |L1.2432|
|L1.2808|
000af8 e1a00000 MOV r0,r0
000afc ebfffffe BL OSTmr_Unlock
000b00 e3a00087 MOV r0,#0x87
000b04 e5c80000 STRB r0,[r8,#0]
000b08 e3a00000 MOV r0,#0
000b0c eaffff9b B |L1.2432|
|L1.2832|
000b10 e1a00000 MOV r0,r0
000b14 ebfffffe BL OSTmr_Unlock
000b18 e3a0008d MOV r0,#0x8d
000b1c e5c80000 STRB r0,[r8,#0]
000b20 e3a00000 MOV r0,#0
000b24 eaffff95 B |L1.2432|
ENDP
OSTmrSignal PROC
;;;716 INT8U OSTmrSignal (void)
;;;717 {
000b28 e92d4010 PUSH {r4,lr}
;;;718 INT8U err;
;;;719
;;;720
;;;721 err = OSSemPost(OSTmrSemSignal);
000b2c e59f0250 LDR r0,|L1.3460|
000b30 e5900000 LDR r0,[r0,#0] ; OSTmrSemSignal
000b34 ebfffffe BL OSSemPost
000b38 e1a04000 MOV r4,r0
;;;722 return (err);
000b3c e1a00004 MOV r0,r4
000b40 e8bd4010 POP {r4,lr}
;;;723 }
000b44 e12fff1e BX lr
ENDP
OSTmr_Task PROC
;;;1083 static void OSTmr_Task (void *p_arg)
;;;1084 {
000b48 e92d43f8 PUSH {r3-r9,lr}
;;;1085 INT8U err;
;;;1086 OS_TMR *ptmr;
;;;1087 OS_TMR *ptmr_next;
;;;1088 OS_TMR_CALLBACK pfnct;
;;;1089 OS_TMR_WHEEL *pspoke;
;;;1090 INT16U spoke;
;;;1091
;;;1092
;;;1093 (void)p_arg; /* Not using 'p_arg', prevent compiler warning */
;;;1094 for (;;) {
000b4c e1a00000 MOV r0,r0
|L1.2896|
;;;1095 OSSemPend(OSTmrSemSignal, 0, &err); /* Wait for signal indicating time to update timers */
000b50 e28d2000 ADD r2,sp,#0
000b54 e3a01000 MOV r1,#0
000b58 e59f0224 LDR r0,|L1.3460|
000b5c e5900000 LDR r0,[r0,#0] ; OSTmrSemSignal
000b60 ebfffffe BL OSSemPend
;;;1096 OSTmr_Lock();
000b64 ebfffffe BL OSTmr_Lock
;;;1097 OSTmrTime++; /* Increment the current time */
000b68 e59f0210 LDR r0,|L1.3456|
000b6c e5900000 LDR r0,[r0,#0] ; OSTmrTime
000b70 e2800001 ADD r0,r0,#1
000b74 e59f1204 LDR r1,|L1.3456|
000b78 e5810000 STR r0,[r1,#0] ; OSTmrTime
;;;1098 spoke = (INT16U)(OSTmrTime % OS_TMR_CFG_WHEEL_SIZE); /* Position on current timer wheel entry */
000b7c e2810000 ADD r0,r1,#0
000b80 e5900000 LDR r0,[r0,#0] ; OSTmrTime
000b84 e2006007 AND r6,r0,#7
;;;1099 pspoke = &OSTmrWheelTbl[spoke];
000b88 e59f01ec LDR r0,|L1.3452|
000b8c e0808186 ADD r8,r0,r6,LSL #3
;;;1100 ptmr = pspoke->OSTmrFirst;
000b90 e5984000 LDR r4,[r8,#0]
;;;1101 while (ptmr != (OS_TMR *)0) {
000b94 ea000018 B |L1.3068|
|L1.2968|
;;;1102 ptmr_next = (OS_TMR *)ptmr->OSTmrNext; /* Point to next timer to update because current ... */
000b98 e594500c LDR r5,[r4,#0xc]
;;;1103 /* ... timer could get unlinked from the wheel. */
;;;1104 if (OSTmrTime == ptmr->OSTmrMatch) { /* Process each timer that expires */
000b9c e59f11dc LDR r1,|L1.3456|
000ba0 e5940014 LDR r0,[r4,#0x14]
000ba4 e5911000 LDR r1,[r1,#0] ; OSTmrTime
000ba8 e1500001 CMP r0,r1
000bac 1a000011 BNE |L1.3064|
;;;1105 pfnct = ptmr->OSTmrCallback; /* Execute callback function if available */
000bb0 e5947004 LDR r7,[r4,#4]
;;;1106 if (pfnct != (OS_TMR_CALLBACK)0) {
000bb4 e3570000 CMP r7,#0
000bb8 0a000003 BEQ |L1.3020|
;;;1107 (*pfnct)((void *)ptmr, ptmr->OSTmrCallbackArg);
000bbc e5941008 LDR r1,[r4,#8]
000bc0 e1a00004 MOV r0,r4
000bc4 e1a0e00f MOV lr,pc
000bc8 e12fff17 BX r7
|L1.3020|
;;;1108 }
;;;1109 OSTmr_Unlink(ptmr); /* Remove from current wheel spoke */
000bcc e1a00004 MOV r0,r4
000bd0 ebfffffe BL OSTmr_Unlink
;;;1110 if (ptmr->OSTmrOpt == OS_TMR_OPT_PERIODIC) {
000bd4 e5d40030 LDRB r0,[r4,#0x30]
000bd8 e3500002 CMP r0,#2
000bdc 1a000003 BNE |L1.3056|
;;;1111 OSTmr_Link(ptmr, OS_TMR_LINK_PERIODIC); /* Recalculate new position of timer in wheel */
000be0 e3a01001 MOV r1,#1
000be4 e1a00004 MOV r0,r4
000be8 ebfffffe BL OSTmr_Link
000bec ea000001 B |L1.3064|
|L1.3056|
;;;1112 } else {
;;;1113 ptmr->OSTmrState = OS_TMR_STATE_COMPLETED; /* Indicate that the timer has completed */
000bf0 e3a00002 MOV r0,#2
000bf4 e5c40031 STRB r0,[r4,#0x31]
|L1.3064|
;;;1114 }
;;;1115 }
;;;1116 ptmr = ptmr_next;
000bf8 e1a04005 MOV r4,r5
|L1.3068|
000bfc e3540000 CMP r4,#0
000c00 1affffe4 BNE |L1.2968|
;;;1117 }
;;;1118 OSTmr_Unlock();
000c04 ebfffffe BL OSTmr_Unlock
000c08 eaffffd0 B |L1.2896|
;;;1119 }
;;;1120 }
ENDP
OSTmr_InitTask PROC
;;;883 static void OSTmr_InitTask (void)
;;;884 {
000c0c e52de
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -