📄 os_tmr.txt
字号:
0003de 808a STRH r2,[r1,#4]
0003e0 e014 B |L1.1036|
0003e2 0000 DCW 0x0000
|L1.996|
0003e4 00000000 DCD OSTmrSem
|L1.1000|
0003e8 00000000 DCD OSTmrFreeList
|L1.1004|
0003ec 00000000 DCD OSTmrUsed
|L1.1008|
0003f0 00000000 DCD OSTmrFree
|L1.1012|
0003f4 00000000 DCD OSIntNesting
|L1.1016|
0003f8 00000000 DCD OSTmrWheelTbl
|L1.1020|
0003fc 00000000 DCD OSTmrTime
|L1.1024|
;;;974 } else {
;;;975 ptmr1 = pspoke->OSTmrFirst; /* Point to first timer in the spoke */
;;;976 pspoke->OSTmrFirst = ptmr;
000400 6008 STR r0,[r1,#0]
;;;977 ptmr->OSTmrNext = (void *)ptmr1;
000402 60c2 STR r2,[r0,#0xc]
;;;978 ptmr1->OSTmrPrev = (void *)ptmr;
000404 6110 STR r0,[r2,#0x10]
;;;979 pspoke->OSTmrEntries++;
000406 888a LDRH r2,[r1,#4]
000408 1c52 ADDS r2,r2,#1
00040a 808a STRH r2,[r1,#4]
|L1.1036|
;;;980 }
;;;981 ptmr->OSTmrPrev = (void *)0; /* Timer always inserted as first node in list */
00040c 6103 STR r3,[r0,#0x10]
;;;982 }
00040e 4770 BX lr
;;;983 #endif
ENDP
OSTmrStart PROC
;;;526 INT8U *perr)
;;;527 {
000410 b570 PUSH {r4-r6,lr}
000412 4605 MOV r5,r0
000414 460c MOV r4,r1
;;;528 #if OS_ARG_CHK_EN > 0
;;;529 if (perr == (INT8U *)0) { /* Validate arguments */
000416 b90c CBNZ r4,|L1.1052|
;;;530 return (OS_FALSE);
000418 2000 MOVS r0,#0
;;;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 }
00041a bd70 POP {r4-r6,pc}
|L1.1052|
00041c b91d CBNZ r5,|L1.1062|
00041e 208a MOVS r0,#0x8a
000420 7020 STRB r0,[r4,#0]
000422 2000 MOVS r0,#0
000424 bd70 POP {r4-r6,pc}
|L1.1062|
000426 7828 LDRB r0,[r5,#0]
000428 2864 CMP r0,#0x64
00042a d003 BEQ |L1.1076|
00042c 2089 MOVS r0,#0x89
00042e 7020 STRB r0,[r4,#0]
000430 2000 MOVS r0,#0
000432 bd70 POP {r4-r6,pc}
|L1.1076|
000434 489c LDR r0,|L1.1704|
000436 7800 LDRB r0,[r0,#0] ; OSIntNesting
000438 b118 CBZ r0,|L1.1090|
00043a 208b MOVS r0,#0x8b
00043c 7020 STRB r0,[r4,#0]
00043e 2000 MOVS r0,#0
000440 bd70 POP {r4-r6,pc}
|L1.1090|
000442 f7fff7ff BL OSTmr_Lock
000446 f895f895 LDRB r0,[r5,#0x31]
00044a b1d8 CBZ r0,|L1.1156|
00044c 2600 MOVS r6,#0
00044e 2801 CMP r0,#1
000450 d00f BEQ |L1.1138|
000452 2802 CMP r0,#2
000454 d00d BEQ |L1.1138|
000456 2803 CMP r0,#3
000458 d11a BNE |L1.1168|
00045a 4628 MOV r0,r5
00045c f7fff7ff BL OSTmr_Unlink
000460 2100 MOVS r1,#0
000462 4628 MOV r0,r5
000464 f7fff7ff BL OSTmr_Link
000468 f7fff7ff BL OSTmr_Unlock
00046c 7026 STRB r6,[r4,#0]
00046e 2001 MOVS r0,#1
000470 bd70 POP {r4-r6,pc}
|L1.1138|
000472 2100 MOVS r1,#0
000474 4628 MOV r0,r5
000476 f7fff7ff BL OSTmr_Link
00047a f7fff7ff BL OSTmr_Unlock
00047e 7026 STRB r6,[r4,#0]
000480 2001 MOVS r0,#1
000482 bd70 POP {r4-r6,pc}
|L1.1156|
000484 f7fff7ff BL OSTmr_Unlock
000488 2087 MOVS r0,#0x87
00048a 7020 STRB r0,[r4,#0]
00048c 2000 MOVS r0,#0
00048e bd70 POP {r4-r6,pc}
|L1.1168|
000490 f7fff7ff BL OSTmr_Unlock
000494 208d MOVS r0,#0x8d
000496 7020 STRB r0,[r4,#0]
000498 2000 MOVS r0,#0
00049a bd70 POP {r4-r6,pc}
;;;572 #endif
ENDP
OSTmrStop PROC
;;;615 INT8U *perr)
;;;616 {
00049c e92de92d PUSH {r4-r8,lr}
0004a0 4605 MOV r5,r0
0004a2 460e MOV r6,r1
0004a4 4617 MOV r7,r2
0004a6 461c MOV r4,r3
;;;617 OS_TMR_CALLBACK pfnct;
;;;618
;;;619
;;;620 #if OS_ARG_CHK_EN > 0
;;;621 if (perr == (INT8U *)0) { /* Validate arguments */
0004a8 b914 CBNZ r4,|L1.1200|
;;;622 return (OS_FALSE);
0004aa 2000 MOVS r0,#0
0004ac e8bde8bd POP {r4-r8,pc}
|L1.1200|
;;;623 }
;;;624 if (ptmr == (OS_TMR *)0) {
0004b0 b925 CBNZ r5,|L1.1212|
;;;625 *perr = OS_ERR_TMR_INVALID;
0004b2 208a MOVS r0,#0x8a
0004b4 7020 STRB r0,[r4,#0]
;;;626 return (OS_FALSE);
0004b6 2000 MOVS r0,#0
0004b8 e8bde8bd POP {r4-r8,pc}
|L1.1212|
;;;627 }
;;;628 #endif
;;;629 if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */
0004bc 7828 LDRB r0,[r5,#0]
0004be 2864 CMP r0,#0x64
0004c0 d004 BEQ |L1.1228|
;;;630 *perr = OS_ERR_TMR_INVALID_TYPE;
0004c2 2089 MOVS r0,#0x89
0004c4 7020 STRB r0,[r4,#0]
;;;631 return (OS_FALSE);
0004c6 2000 MOVS r0,#0
0004c8 e8bde8bd POP {r4-r8,pc}
|L1.1228|
;;;632 }
;;;633 if (OSIntNesting > 0) { /* See if trying to call from an ISR */
0004cc 4876 LDR r0,|L1.1704|
0004ce 7800 LDRB r0,[r0,#0] ; OSIntNesting
0004d0 b120 CBZ r0,|L1.1244|
;;;634 *perr = OS_ERR_TMR_ISR;
0004d2 208b MOVS r0,#0x8b
0004d4 7020 STRB r0,[r4,#0]
;;;635 return (OS_FALSE);
0004d6 2000 MOVS r0,#0
0004d8 e8bde8bd POP {r4-r8,pc}
|L1.1244|
;;;636 }
;;;637 OSTmr_Lock();
0004dc f7fff7ff BL OSTmr_Lock
;;;638 switch (ptmr->OSTmrState) {
0004e0 f895f895 LDRB r0,[r5,#0x31]
0004e4 2800 CMP r0,#0
0004e6 d02e BEQ |L1.1350|
0004e8 2801 CMP r0,#1
0004ea d025 BEQ |L1.1336|
0004ec 2802 CMP r0,#2
0004ee d023 BEQ |L1.1336|
0004f0 2803 CMP r0,#3
0004f2 d12f BNE |L1.1364|
;;;639 case OS_TMR_STATE_RUNNING:
;;;640 OSTmr_Unlink(ptmr); /* Remove from current wheel spoke */
0004f4 4628 MOV r0,r5
0004f6 f7fff7ff BL OSTmr_Unlink
;;;641 *perr = OS_ERR_NONE;
0004fa 2000 MOVS r0,#0
0004fc 7020 STRB r0,[r4,#0]
;;;642 switch (opt) {
0004fe b1b6 CBZ r6,|L1.1326|
000500 208f MOVS r0,#0x8f
000502 2e03 CMP r6,#3
000504 d007 BEQ |L1.1302|
000506 2e04 CMP r6,#4
000508 d10f BNE |L1.1322|
;;;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 ... */
00050a 686a LDR r2,[r5,#4]
;;;654 if (pfnct != (OS_TMR_CALLBACK)0) {
00050c b15a CBZ r2,|L1.1318|
00050e 4639 MOV r1,r7
000510 4628 MOV r0,r5
000512 4790 BLX r2
;;;655 (*pfnct)((void *)ptmr, callback_arg); /* ... using the 'callback_arg' provided in call */
000514 e00b B |L1.1326|
|L1.1302|
000516 686a LDR r2,[r5,#4]
000518 b11a CBZ r2,|L1.1314|
00051a 4628 MOV r0,r5
00051c 68a9 LDR r1,[r5,#8]
00051e 4790 BLX r2
000520 e005 B |L1.1326|
|L1.1314|
000522 7020 STRB r0,[r4,#0]
000524 e003 B |L1.1326|
|L1.1318|
;;;656 } else {
;;;657 *perr = OS_ERR_TMR_NO_CALLBACK;
000526 7020 STRB r0,[r4,#0]
000528 e001 B |L1.1326|
|L1.1322|
;;;658 }
;;;659 break;
;;;660
;;;661 case OS_TMR_OPT_NONE:
;;;662 break;
;;;663
;;;664 default:
;;;665 *perr = OS_ERR_TMR_INVALID_OPT;
00052a 2084 MOVS r0,#0x84
00052c 7020 STRB r0,[r4,#0]
|L1.1326|
;;;666 break;
;;;667 }
;;;668 OSTmr_Unlock();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -