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