os_time.ls1
来自「在51单片机上移植成功的UCOS-II操作系统源代码,包括源代码及相关注释」· LS1 代码 · 共 1,130 行 · 第 1/5 页
LS1
1,130 行
625 ; /*$PAGE*/
A51 MACRO ASSEMBLER OS_TIME 09/09/2007 21:13:22 PAGE 11
626 ; /*
627 ; *****************************************************************************************
****************
628 ; * RESUME A DELAYED TASK
629 ; *
630 ; * Description: This function is used resume a task that has been delayed through a call t
o either
631 ; * OSTimeDly() or OSTimeDlyHMSM(). Note that you MUST NOT call this function
to resume a
632 ; * task that is waiting for an event with timeout. This situation would make
the task look
633 ; * like a timeout occurred (unless you desire this effect). Also, you cannot
resume a task
634 ; * that has called OSTimeDlyHMSM() with a combined time that exceeds 65535 cl
ock ticks. In
635 ; * other words, if the clock tick runs at 100 Hz then, you will not be able t
o resume a
636 ; * delayed task that called OSTimeDlyHMSM(0, 10, 55, 350) or higher.
637 ; *
638 ; * (10 Minutes * 60 + 55 Seconds + 0.35) * 100 ticks/second.
639 ; *
640 ; * Arguments : prio specifies the priority of the task to resume
641 ; *
642 ; * Returns : OS_NO_ERR Task has been resumed
643 ; * OS_PRIO_INVALID if the priority you specify is higher that the m
aximum allowed
644 ; * (i.e. >= OS_LOWEST_PRIO)
645 ; * OS_TIME_NOT_DLY Task is not waiting for time to expire
646 ; * OS_TASK_NOT_EXIST The desired task has not been created
647 ; *****************************************************************************************
****************
648 ; */
649 ;
650 ; INT8U OSTimeDlyResume (INT8U prio) reentrant
651
---- 652 RSEG ?PR?_?OSTimeDlyResume?OS_TIME
0000 653 _?OSTimeDlyResume:
654 USING 0
655 ; SOURCE LINE # 133
0000 90FFFF 656 MOV DPTR,#0FFFFH
0003 120000 F 657 LCALL ?C?ADDXBP
0006 EF 658 MOV A,R7
0007 F0 659 MOVX @DPTR,A
0008 90FFFD 660 MOV DPTR,#0FFFDH
000B 120000 F 661 LCALL ?C?ADDXBP
662 ; {
663 ; OS_TCB *ptcb;
664 ;
665 ;
666 ; if (prio >= OS_LOWEST_PRIO) {
667 ; SOURCE LINE # 138
000E 900003 668 MOV DPTR,#03H
0011 120000 F 669 LCALL ?C?XBPOFF
0014 E0 670 MOVX A,@DPTR
0015 FE 671 MOV R6,A
0016 C3 672 CLR C
0017 941C 673 SUBB A,#01CH
0019 4005 674 JC ?C0013
675 ; return (OS_PRIO_INVALID);
676 ; SOURCE LINE # 139
001B 7F2A 677 MOV R7,#02AH
001D 020000 F 678 LJMP ?C0014
679 ; }
680 ; SOURCE LINE # 140
0020 681 ?C0013:
682 ; OS_ENTER_CRITICAL();
A51 MACRO ASSEMBLER OS_TIME 09/09/2007 21:13:22 PAGE 12
683 ; SOURCE LINE # 141
0020 C2AF 684 CLR EA
685 ; ptcb = (OS_TCB *)OSTCBPrioTbl[prio]; /* Make sure that task exist
*/
686 ; SOURCE LINE # 142
0022 EE 687 MOV A,R6
0023 75F003 688 MOV B,#03H
0026 A4 689 MUL AB
0027 2400 F 690 ADD A,#LOW (OSTCBPrioTbl)
0029 F582 691 MOV DPL,A
002B E4 692 CLR A
002C 3400 F 693 ADDC A,#HIGH (OSTCBPrioTbl)
002E F583 694 MOV DPH,A
0030 E0 695 MOVX A,@DPTR
0031 F9 696 MOV R1,A
0032 A3 697 INC DPTR
0033 E0 698 MOVX A,@DPTR
0034 FA 699 MOV R2,A
0035 A3 700 INC DPTR
0036 E0 701 MOVX A,@DPTR
0037 850083 F 702 MOV DPH,?C_XBP
003A 850082 F 703 MOV DPL,?C_XBP+01H
003D C9 704 XCH A,R1
003E F0 705 MOVX @DPTR,A
003F A3 706 INC DPTR
0040 EA 707 MOV A,R2
0041 F0 708 MOVX @DPTR,A
0042 A3 709 INC DPTR
0043 E9 710 MOV A,R1
0044 F0 711 MOVX @DPTR,A
712 ; if (ptcb != (OS_TCB *)0) {
713 ; SOURCE LINE # 143
0045 850083 F 714 MOV DPH,?C_XBP
0048 850082 F 715 MOV DPL,?C_XBP+01H
004B E0 716 MOVX A,@DPTR
004C FB 717 MOV R3,A
004D A3 718 INC DPTR
004E E0 719 MOVX A,@DPTR
004F FA 720 MOV R2,A
0050 A3 721 INC DPTR
0051 E0 722 MOVX A,@DPTR
0052 4A 723 ORL A,R2
0053 4B 724 ORL A,R3
0054 7003 725 JNZ $ + 5H
0056 020000 F 726 LJMP ?C0015
727 ; if (ptcb->OSTCBDly != 0) { /* See if task is delayed
*/
728 ; SOURCE LINE # 144
0059 850083 F 729 MOV DPH,?C_XBP
005C 850082 F 730 MOV DPL,?C_XBP+01H
005F E0 731 MOVX A,@DPTR
0060 FB 732 MOV R3,A
0061 A3 733 INC DPTR
0062 E0 734 MOVX A,@DPTR
0063 FA 735 MOV R2,A
0064 A3 736 INC DPTR
0065 E0 737 MOVX A,@DPTR
0066 F9 738 MOV R1,A
0067 900009 739 MOV DPTR,#09H
006A 120000 F 740 LCALL ?C?ILDOPTR
006D 45F0 741 ORL A,B
006F 6070 742 JZ ?C0016
743 ; ptcb->OSTCBDly = 0; /* Clear the time delay
*/
744 ; SOURCE LINE # 145
0071 900009 745 MOV DPTR,#09H
A51 MACRO ASSEMBLER OS_TIME 09/09/2007 21:13:22 PAGE 13
0074 E4 746 CLR A
0075 F5F0 747 MOV B,A
0077 120000 F 748 LCALL ?C?ISTOPTR
749 ; if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) { /* See if task is ready to run
*/
750 ; SOURCE LINE # 146
007A 90000B 751 MOV DPTR,#0BH
007D 120000 F 752 LCALL ?C?CLDOPTR
0080 20E358 753 JB ACC.3,?C0017
754 ; OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run
*/
755 ; SOURCE LINE # 147
0083 900000 F 756 MOV DPTR,#OSRdyGrp
0086 E0 757 MOVX A,@DPTR
0087 FF 758 MOV R7,A
0088 850083 F 759 MOV DPH,?C_XBP
008B 850082 F 760 MOV DPL,?C_XBP+01H
008E E0 761 MOVX A,@DPTR
008F FB 762 MOV R3,A
0090 A3 763 INC DPTR
0091 E0 764 MOVX A,@DPTR
0092 FA 765 MOV R2,A
0093 A3 766 INC DPTR
0094 E0 767 MOVX A,@DPTR
0095 F9 768 MOV R1,A
0096 900010 769 MOV DPTR,#010H
0099 120000 F 770 LCALL ?C?CLDOPTR
009C FE 771 MOV R6,A
009D EF 772 MOV A,R7
009E 4E 773 ORL A,R6
009F 900000 F 774 MOV DPTR,#OSRdyGrp
00A2 F0 775 MOVX @DPTR,A
776 ; OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
777 ; SOURCE LINE # 148
00A3 90000E 778 MOV DPTR,#0EH
00A6 120000 F 779 LCALL ?C?CLDOPTR
00A9 2400 F 780 ADD A,#LOW (OSRdyTbl)
00AB F582 781 MOV DPL,A
00AD E4 782 CLR A
00AE 3400 F 783 ADDC A,#HIGH (OSRdyTbl)
00B0 F583 784 MOV DPH,A
00B2 C083 785 PUSH DPH
00B4 C082 786 PUSH DPL
00B6 E0 787 MOVX A,@DPTR
00B7 FF 788 MOV R7,A
00B8 850083 F 789 MOV DPH,?C_XBP
00BB 850082 F 790 MOV DPL,?C_XBP+01H
00BE E0 791 MOVX A,@DPTR
00BF FB 792 MOV R3,A
00C0 A3 793 INC DPTR
00C1 E0 794 MOVX A,@DPTR
00C2 FA 795 MOV R2,A
00C3 A3 796 INC DPTR
00C4 E0 797 MOVX A,@DPTR
00C5 F9 798 MOV R1,A
00C6 90000F 799 MOV DPTR,#0FH
00C9 120000 F 800 LCALL ?C?CLDOPTR
00CC FE 801 MOV R6,A
00CD EF 802 MOV A,R7
00CE 4E 803 ORL A,R6
00CF D082 804 POP DPL
00D1 D083 805 POP DPH
00D3 F0 806 MOVX @DPTR,A
807 ; OS_EXIT_CRITICAL();
808 ; SOURCE LINE # 149
00D4 D2AF 809 SETB EA
A51 MACRO ASSEMBLER OS_TIME 09/09/2007 21:13:22 PAGE 14
810 ; OSSched(); /* See if this is new highest
priority */
811 ; SOURCE LINE # 150
00D6 120000 F 812 LCALL _?OSSched
813 ; } else {
814 ; SOURCE LINE # 151
00D9 8002 815 SJMP ?C0018
00DB 816 ?C0017:
817 ; OS_EXIT_CRITICAL(); /* Task may be suspended
*/
818 ; SOURCE LINE # 152
00DB D2AF 819 SETB EA
820 ; }
821 ; SOURCE LINE # 153
00DD 822 ?C0018:
823 ; return (OS_NO_ERR);
824 ; SOURCE LINE # 154
00DD 7F00 825 MOV R7,#00H
00DF 800A 826 SJMP ?C0014
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?