📄 os_tmr.txt
字号:
;;;370 if (perr == (INT8U *)0) {
000298 b914 CBNZ r4,|L1.672|
;;;371 return (0);
00029a 2000 MOVS r0,#0
00029c e8bde8bd POP {r4-r8,pc}
|L1.672|
;;;372 }
;;;373 if (ptmr == (OS_TMR *)0) {
0002a0 b925 CBNZ r5,|L1.684|
;;;374 *perr = OS_ERR_TMR_INVALID;
0002a2 208a MOVS r0,#0x8a
0002a4 7020 STRB r0,[r4,#0]
;;;375 return (0);
0002a6 2000 MOVS r0,#0
0002a8 e8bde8bd POP {r4-r8,pc}
|L1.684|
;;;376 }
;;;377 #endif
;;;378 if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */
0002ac 7828 LDRB r0,[r5,#0]
0002ae 2864 CMP r0,#0x64
0002b0 d004 BEQ |L1.700|
;;;379 *perr = OS_ERR_TMR_INVALID_TYPE;
0002b2 2089 MOVS r0,#0x89
0002b4 7020 STRB r0,[r4,#0]
;;;380 return (0);
0002b6 2000 MOVS r0,#0
0002b8 e8bde8bd POP {r4-r8,pc}
|L1.700|
;;;381 }
;;;382 if (OSIntNesting > 0) { /* See if trying to call from an ISR */
0002bc 484d LDR r0,|L1.1012|
0002be 7800 LDRB r0,[r0,#0] ; OSIntNesting
0002c0 b120 CBZ r0,|L1.716|
;;;383 *perr = OS_ERR_TMR_ISR;
0002c2 208b MOVS r0,#0x8b
0002c4 7020 STRB r0,[r4,#0]
;;;384 return (0);
0002c6 2000 MOVS r0,#0
0002c8 e8bde8bd POP {r4-r8,pc}
|L1.716|
;;;385 }
;;;386 OSTmr_Lock();
0002cc f7fff7ff BL OSTmr_Lock
;;;387 switch (ptmr->OSTmrState) {
0002d0 f895f895 LDRB r0,[r5,#0x31]
0002d4 2800 CMP r0,#0
0002d6 d028 BEQ |L1.810|
0002d8 2700 MOVS r7,#0
0002da 2801 CMP r0,#1
0002dc d00d BEQ |L1.762|
0002de 2802 CMP r0,#2
0002e0 d01d BEQ |L1.798|
0002e2 2803 CMP r0,#3
0002e4 d128 BNE |L1.824|
;;;388 case OS_TMR_STATE_RUNNING:
;;;389 remain = ptmr->OSTmrMatch - OSTmrTime; /* Determine how much time is left to timeout */
0002e6 4945 LDR r1,|L1.1020|
0002e8 6968 LDR r0,[r5,#0x14]
0002ea 6809 LDR r1,[r1,#0] ; OSTmrTime
0002ec 1a45 SUBS r5,r0,r1
;;;390 OSTmr_Unlock();
0002ee f7fff7ff BL OSTmr_Unlock
;;;391 *perr = OS_ERR_NONE;
0002f2 7027 STRB r7,[r4,#0]
;;;392 return (remain);
0002f4 4628 MOV r0,r5
0002f6 e8bde8bd POP {r4-r8,pc}
|L1.762|
;;;393
;;;394 case OS_TMR_STATE_STOPPED: /* It's assumed that the timer has not started yet */
;;;395 switch (ptmr->OSTmrOpt) {
0002fa f895f895 LDRB r0,[r5,#0x30]
0002fe 2802 CMP r0,#2
000300 d106 BNE |L1.784|
;;;396 case OS_TMR_OPT_PERIODIC:
;;;397 if (ptmr->OSTmrDly == 0) {
000302 69ae LDR r6,[r5,#0x18]
000304 b906 CBNZ r6,|L1.776|
;;;398 remain = ptmr->OSTmrPeriod;
000306 69ee LDR r6,[r5,#0x1c]
|L1.776|
;;;399 } else {
;;;400 remain = ptmr->OSTmrDly;
;;;401 }
;;;402 OSTmr_Unlock();
000308 f7fff7ff BL OSTmr_Unlock
;;;403 *perr = OS_ERR_NONE;
00030c 7027 STRB r7,[r4,#0]
;;;404 break;
00030e e003 B |L1.792|
|L1.784|
;;;405
;;;406 case OS_TMR_OPT_ONE_SHOT:
;;;407 default:
;;;408 remain = ptmr->OSTmrDly;
000310 69ae LDR r6,[r5,#0x18]
;;;409 OSTmr_Unlock();
000312 f7fff7ff BL OSTmr_Unlock
;;;410 *perr = OS_ERR_NONE;
000316 7027 STRB r7,[r4,#0]
|L1.792|
;;;411 break;
;;;412 }
;;;413 return (remain);
000318 4630 MOV r0,r6
00031a e8bde8bd POP {r4-r8,pc}
|L1.798|
;;;414
;;;415 case OS_TMR_STATE_COMPLETED: /* Only ONE-SHOT that timed out can be in this state */
;;;416 OSTmr_Unlock();
00031e f7fff7ff BL OSTmr_Unlock
;;;417 *perr = OS_ERR_NONE;
000322 7027 STRB r7,[r4,#0]
;;;418 return (0);
000324 2000 MOVS r0,#0
000326 e8bde8bd POP {r4-r8,pc}
|L1.810|
;;;419
;;;420 case OS_TMR_STATE_UNUSED:
;;;421 OSTmr_Unlock();
00032a f7fff7ff BL OSTmr_Unlock
;;;422 *perr = OS_ERR_TMR_INACTIVE;
00032e 2087 MOVS r0,#0x87
000330 7020 STRB r0,[r4,#0]
;;;423 return (0);
000332 2000 MOVS r0,#0
000334 e8bde8bd POP {r4-r8,pc}
|L1.824|
;;;424
;;;425 default:
;;;426 OSTmr_Unlock();
000338 f7fff7ff BL OSTmr_Unlock
;;;427 *perr = OS_ERR_TMR_INVALID_STATE;
00033c 208d MOVS r0,#0x8d
00033e 7020 STRB r0,[r4,#0]
;;;428 return (0);
000340 2000 MOVS r0,#0
;;;429 }
;;;430 }
000342 e8bde8bd POP {r4-r8,pc}
;;;431 #endif
ENDP
OSTmrStateGet PROC
;;;461 INT8U *perr)
;;;462 {
000346 b570 PUSH {r4-r6,lr}
000348 4605 MOV r5,r0
00034a 460c MOV r4,r1
;;;463 INT8U state;
;;;464
;;;465
;;;466 #if OS_ARG_CHK_EN > 0
;;;467 if (perr == (INT8U *)0) {
00034c b90c CBNZ r4,|L1.850|
;;;468 return (0);
00034e 2000 MOVS r0,#0
;;;469 }
;;;470 if (ptmr == (OS_TMR *)0) {
;;;471 *perr = OS_ERR_TMR_INVALID;
;;;472 return (0);
;;;473 }
;;;474 #endif
;;;475 if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */
;;;476 *perr = OS_ERR_TMR_INVALID_TYPE;
;;;477 return (0);
;;;478 }
;;;479 if (OSIntNesting > 0) { /* See if trying to call from an ISR */
;;;480 *perr = OS_ERR_TMR_ISR;
;;;481 return (0);
;;;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 }
000350 bd70 POP {r4-r6,pc}
|L1.850|
000352 b91d CBNZ r5,|L1.860|
000354 208a MOVS r0,#0x8a
000356 7020 STRB r0,[r4,#0]
000358 2000 MOVS r0,#0
00035a bd70 POP {r4-r6,pc}
|L1.860|
00035c 7828 LDRB r0,[r5,#0]
00035e 2864 CMP r0,#0x64
000360 d003 BEQ |L1.874|
000362 2089 MOVS r0,#0x89
000364 7020 STRB r0,[r4,#0]
000366 2000 MOVS r0,#0
000368 bd70 POP {r4-r6,pc}
|L1.874|
00036a 4822 LDR r0,|L1.1012|
00036c 7800 LDRB r0,[r0,#0] ; OSIntNesting
00036e b118 CBZ r0,|L1.888|
000370 208b MOVS r0,#0x8b
000372 7020 STRB r0,[r4,#0]
000374 2000 MOVS r0,#0
000376 bd70 POP {r4-r6,pc}
|L1.888|
000378 f7fff7ff BL OSTmr_Lock
00037c f895f895 LDRB r5,[r5,#0x31]
000380 b12d CBZ r5,|L1.910|
000382 2d01 CMP r5,#1
000384 d003 BEQ |L1.910|
000386 2d02 CMP r5,#2
000388 d001 BEQ |L1.910|
00038a 2d03 CMP r5,#3
00038c d102 BNE |L1.916|
|L1.910|
00038e 2000 MOVS r0,#0
000390 7020 STRB r0,[r4,#0]
000392 e001 B |L1.920|
|L1.916|
000394 208d MOVS r0,#0x8d
000396 7020 STRB r0,[r4,#0]
|L1.920|
000398 f7fff7ff BL OSTmr_Unlock
00039c 4628 MOV r0,r5
00039e bd70 POP {r4-r6,pc}
;;;500 #endif
ENDP
OSTmr_Link PROC
;;;956
;;;957 ptmr->OSTmrState = OS_TMR_STATE_RUNNING;
0003a0 2203 MOVS r2,#3
0003a2 f880f880 STRB r2,[r0,#0x31]
;;;958 if (type == OS_TMR_LINK_PERIODIC) { /* Determine when timer will expire */
0003a6 4a15 LDR r2,|L1.1020|
0003a8 2901 CMP r1,#1
0003aa 6812 LDR r2,[r2,#0]
0003ac d103 BNE |L1.950|
;;;959 ptmr->OSTmrMatch = ptmr->OSTmrPeriod + OSTmrTime;
0003ae 69c1 LDR r1,[r0,#0x1c]
0003b0 4411 ADD r1,r1,r2
0003b2 6141 STR r1,[r0,#0x14]
0003b4 e007 B |L1.966|
|L1.950|
;;;960 } else {
;;;961 if (ptmr->OSTmrDly == 0) {
0003b6 6981 LDR r1,[r0,#0x18]
0003b8 b919 CBNZ r1,|L1.962|
;;;962 ptmr->OSTmrMatch = ptmr->OSTmrPeriod + OSTmrTime;
0003ba 69c1 LDR r1,[r0,#0x1c]
0003bc 4411 ADD r1,r1,r2
0003be 6141 STR r1,[r0,#0x14]
0003c0 e001 B |L1.966|
|L1.962|
;;;963 } else {
;;;964 ptmr->OSTmrMatch = ptmr->OSTmrDly + OSTmrTime;
0003c2 4411 ADD r1,r1,r2
0003c4 6141 STR r1,[r0,#0x14]
|L1.966|
;;;965 }
;;;966 }
;;;967 spoke = (INT16U)(ptmr->OSTmrMatch % OS_TMR_CFG_WHEEL_SIZE);
0003c6 6941 LDR r1,[r0,#0x14]
0003c8 f001f001 AND r1,r1,#7
;;;968 pspoke = &OSTmrWheelTbl[spoke];
0003cc 4a0a LDR r2,|L1.1016|
0003ce eb02eb02 ADD r1,r2,r1,LSL #3
;;;969
;;;970 if (pspoke->OSTmrFirst == (OS_TMR *)0) { /* Link into timer wheel */
0003d2 680a LDR r2,[r1,#0]
0003d4 2300 MOVS r3,#0
0003d6 b99a CBNZ r2,|L1.1024|
;;;971 pspoke->OSTmrFirst = ptmr;
0003d8 6008 STR r0,[r1,#0]
;;;972 ptmr->OSTmrNext = (OS_TMR *)0;
0003da 60c3 STR r3,[r0,#0xc]
;;;973 pspoke->OSTmrEntries = 1;
0003dc 2201 MOVS r2,#1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -