📄 os_tmr.lst
字号:
\ 00000030 ........ BL OSTmr_Lock
484 state = ptmr->OSTmrState;
\ 00000034 3135 ADDS R5,R5,#+49
\ 00000036 2D78 LDRB R5,[R5, #+0]
485 switch (state) {
\ 00000038 2800 MOVS R0,R5
\ 0000003A 0328 CMP R0,#+3
\ 0000003C 02D8 BHI.N ??OSTmrStateGet_5
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;
\ 0000003E 0020 MOVS R0,#+0
\ 00000040 2070 STRB R0,[R4, #+0]
\ 00000042 01E0 B.N ??OSTmrStateGet_6
491 break;
492
493 default:
494 *perr = OS_ERR_TMR_INVALID_STATE;
\ ??OSTmrStateGet_5:
\ 00000044 8D20 MOVS R0,#+141
\ 00000046 2070 STRB R0,[R4, #+0]
495 break;
496 }
497 OSTmr_Unlock();
\ ??OSTmrStateGet_6:
\ 00000048 ........ BL OSTmr_Unlock
498 return (state);
\ 0000004C 2800 MOVS R0,R5
\ 0000004E 30BD POP {R4,R5,PC} ;; return
499 }
500 #endif
501
502 /*$PAGE*/
503 /*
504 ************************************************************************************************************************
505 * START A TIMER
506 *
507 * Description: This function is called by your application code to start a timer.
508 *
509 * Arguments : ptmr Is a pointer to an OS_TMR
510 *
511 * perr Is a pointer to an error code. '*perr' will contain one of the following:
512 * OS_ERR_NONE
513 * OS_ERR_TMR_INVALID
514 * OS_ERR_TMR_INVALID_TYPE 'ptmr' is not pointing to an OS_TMR
515 * OS_ERR_TMR_ISR if the call was made from an ISR
516 * OS_ERR_TMR_INACTIVE if the timer was not created
517 * OS_ERR_TMR_INVALID_STATE the timer is in an invalid state
518 *
519 * Returns : OS_TRUE if the timer was started
520 * OS_FALSE if an error was detected
521 ************************************************************************************************************************
522 */
523
524 #if OS_TMR_EN > 0
\ In segment CODE, align 4, keep-with-next
525 BOOLEAN OSTmrStart (OS_TMR *ptmr,
526 INT8U *perr)
527 {
\ OSTmrStart:
\ 00000000 30B5 PUSH {R4,R5,LR}
\ 00000002 0500 MOVS R5,R0
\ 00000004 0C00 MOVS R4,R1
528 #if OS_ARG_CHK_EN > 0
529 if (perr == (INT8U *)0) { /* Validate arguments */
\ 00000006 01D1 BNE.N ??OSTmrStart_0
530 return (OS_FALSE);
\ ??OSTmrStart_1:
\ 00000008 0020 MOVS R0,#+0
\ 0000000A 30BD POP {R4,R5,PC} ;; return
531 }
532 if (ptmr == (OS_TMR *)0) {
\ ??OSTmrStart_0:
\ 0000000C 002D CMP R5,#+0
\ 0000000E 02D1 BNE.N ??OSTmrStart_2
533 *perr = OS_ERR_TMR_INVALID;
\ 00000010 8A20 MOVS R0,#+138
\ 00000012 2070 STRB R0,[R4, #+0]
\ 00000014 F8E7 B.N ??OSTmrStart_1
534 return (OS_FALSE);
535 }
536 #endif
537 if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */
\ ??OSTmrStart_2:
\ 00000016 2878 LDRB R0,[R5, #+0]
\ 00000018 6428 CMP R0,#+100
\ 0000001A 02D0 BEQ.N ??OSTmrStart_3
538 *perr = OS_ERR_TMR_INVALID_TYPE;
\ 0000001C 8920 MOVS R0,#+137
\ 0000001E 2070 STRB R0,[R4, #+0]
\ 00000020 F2E7 B.N ??OSTmrStart_1
539 return (OS_FALSE);
540 }
541 if (OSIntNesting > 0) { /* See if trying to call from an ISR */
\ ??OSTmrStart_3:
\ 00000022 .... LDR.N R0,??DataTable6 ;; OSIntNesting
\ 00000024 0078 LDRB R0,[R0, #+0]
\ 00000026 0028 CMP R0,#+0
\ 00000028 02D0 BEQ.N ??OSTmrStart_4
542 *perr = OS_ERR_TMR_ISR;
\ 0000002A 8B20 MOVS R0,#+139
\ 0000002C 2070 STRB R0,[R4, #+0]
\ 0000002E EBE7 B.N ??OSTmrStart_1
543 return (OS_FALSE);
544 }
545 OSTmr_Lock();
\ ??OSTmrStart_4:
\ 00000030 ........ BL OSTmr_Lock
546 switch (ptmr->OSTmrState) {
\ 00000034 95F83100 LDRB R0,[R5, #+49]
\ 00000038 0028 CMP R0,#+0
\ 0000003A 11D0 BEQ.N ??OSTmrStart_5
\ 0000003C 401E SUBS R0,R0,#+1
\ 0000003E 0128 CMP R0,#+1
\ 00000040 04D9 BLS.N ??OSTmrStart_6
\ 00000042 801E SUBS R0,R0,#+2
\ 00000044 11D1 BNE.N ??OSTmrStart_7
547 case OS_TMR_STATE_RUNNING: /* Restart the timer */
548 OSTmr_Unlink(ptmr); /* ... Stop the timer */
\ 00000046 2800 MOVS R0,R5
\ 00000048 ........ BL OSTmr_Unlink
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 */
\ ??OSTmrStart_6:
\ 0000004C 0021 MOVS R1,#+0
\ 0000004E 2800 MOVS R0,R5
\ 00000050 ........ BL OSTmr_Link
557 OSTmr_Unlock();
\ 00000054 ........ BL OSTmr_Unlock
558 *perr = OS_ERR_NONE;
\ 00000058 0020 MOVS R0,#+0
\ 0000005A 2070 STRB R0,[R4, #+0]
559 return (OS_TRUE);
\ 0000005C 0120 MOVS R0,#+1
\ 0000005E 30BD POP {R4,R5,PC}
560
561 case OS_TMR_STATE_UNUSED: /* Timer not created */
562 OSTmr_Unlock();
\ ??OSTmrStart_5:
\ 00000060 ........ BL OSTmr_Unlock
563 *perr = OS_ERR_TMR_INACTIVE;
\ 00000064 8720 MOVS R0,#+135
\ 00000066 2070 STRB R0,[R4, #+0]
\ 00000068 CEE7 B.N ??OSTmrStart_1
564 return (OS_FALSE);
565
566 default:
567 OSTmr_Unlock();
\ ??OSTmrStart_7:
\ 0000006A ........ BL OSTmr_Unlock
568 *perr = OS_ERR_TMR_INVALID_STATE;
\ 0000006E 8D20 MOVS R0,#+141
\ 00000070 2070 STRB R0,[R4, #+0]
\ 00000072 C9E7 B.N ??OSTmrStart_1
569 return (OS_FALSE);
570 }
571 }
572 #endif
573
574 /*$PAGE*/
575 /*
576 ************************************************************************************************************************
577 * STOP A TIMER
578 *
579 * Description: This function is called by your application code to stop a timer.
580 *
581 * Arguments : ptmr Is a pointer to the timer to stop.
582 *
583 * opt Allows you to specify an option to this functions which can be:
584 *
585 * OS_TMR_OPT_NONE Do nothing special but stop the timer
586 * OS_TMR_OPT_CALLBACK Execute the callback function, pass it the callback argument
587 * specified when the timer was created.
588 * OS_TMR_OPT_CALLBACK_ARG Execute the callback function, pass it the callback argument
589 * specified in THIS function call
590 *
591 * callback_arg Is a pointer to a 'new' callback argument that can be passed to the callback function
592 * instead of the timer's callback argument. In other words, use 'callback_arg' passed in
593 * THIS function INSTEAD of ptmr->OSTmrCallbackArg
594 *
595 * perr Is a pointer to an error code. '*perr' will contain one of the following:
596 * OS_ERR_NONE
597 * OS_ERR_TMR_INVALID 'ptmr' is a NULL pointer
598 * OS_ERR_TMR_INVALID_TYPE 'ptmr' is not pointing to an OS_TMR
599 * OS_ERR_TMR_ISR if the function was called from an ISR
600 * OS_ERR_TMR_INACTIVE if the timer was not created
601 * OS_ERR_TMR_INVALID_OPT if you specified an invalid option for 'opt'
602 * OS_ERR_TMR_STOPPED if the timer was already stopped
603 * OS_ERR_TMR_INVALID_STATE the timer is in an invalid state
604 * OS_ERR_TMR_NO_CALLBACK if the timer does not have a callback function defined
605 *
606 * Returns : OS_TRUE If we stopped the timer (if the timer is already stopped, we also return OS_TRUE)
607 * OS_FALSE If not
608 ************************************************************************************************************************
609 */
610
611 #if OS_TMR_EN > 0
\ In segment CODE, align 4, keep-with-next
612 BOOLEAN OSTmrStop (OS_TMR *ptmr,
613 INT8U opt,
614 void *callback_arg,
615 INT8U *perr)
616 {
\ OSTmrStop:
\ 00000000 F0B5 PUSH {R4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -