📄 os_core.ls1
字号:
604 ; SOURCE LINE # 115
0012 020000 F 605 LJMP OSInitHookEnd
606 ; END OF _?OSInit
607
608 ; #endif
609 ; }
610 ; /*$PAGE*/
611 ; /*
612 ; *****************************************************************************************
****************
A51 MACRO ASSEMBLER OS_CORE 08/08/2005 12:35:32 PAGE 11
613 ; * ENTER ISR
614 ; *
615 ; * Description: This function is used to notify uC/OS-II that you are about to service an
interrupt
616 ; * service routine (ISR). This allows uC/OS-II to keep track of interrupt ne
sting and thus
617 ; * only perform rescheduling at the last nested ISR.
618 ; *
619 ; * Arguments : none
620 ; *
621 ; * Returns : none
622 ; *
623 ; * Notes : 1) This function should be called ith interrupts already disabled
624 ; * 2) Your ISR can directly increment OSIntNesting without calling this funct
ion because
625 ; * OSIntNesting has been declared 'global'.
626 ; * 3) You MUST still call OSIntExit() even though you increment OSIntNesting
directly.
627 ; * 4) You MUST invoke OSIntEnter() and OSIntExit() in pair. In other words,
for every call
628 ; * to OSIntEnter() at the beginning of the ISR you MUST have a call to OSI
ntExit() at the
629 ; * end of the ISR.
630 ; * 5) You are allowed to nest interrupts up to 255 levels deep.
631 ; * 6) I removed the OS_ENTER_CRITICAL() and OS_EXIT_CRITICAL() around the inc
rement because
632 ; * OSIntEnter() is always called with interrupts disabled.
633 ; *****************************************************************************************
****************
634 ; */
635 ;
636 ; void OSIntEnter (void) reentrant
637
---- 638 RSEG ?PR?_?OSIntEnter?OS_CORE
0000 639 _?OSIntEnter:
640 USING 0
641 ; SOURCE LINE # 144
642 ; {
643 ; if (OSRunning == TRUE) {
644 ; SOURCE LINE # 146
0000 7800 F 645 MOV R0,#LOW (OSRunning)
0002 E6 646 MOV A,@R0
0003 B4010C 647 CJNE A,#01H,?C0004
648 ; if (OSIntNesting < 255) {
649 ; SOURCE LINE # 147
0006 900000 F 650 MOV DPTR,#OSIntNesting
0009 E0 651 MOVX A,@DPTR
000A C3 652 CLR C
000B 94FF 653 SUBB A,#0FFH
000D 5003 654 JNC ?C0004
655 ; OSIntNesting++; /* Increment ISR nesting level
*/
656 ; SOURCE LINE # 148
000F E0 657 MOVX A,@DPTR
0010 04 658 INC A
0011 F0 659 MOVX @DPTR,A
660 ; }
661 ; SOURCE LINE # 149
662 ; }
663 ; SOURCE LINE # 150
664 ; }
665 ; SOURCE LINE # 151
0012 666 ?C0004:
0012 22 667 RET
668 ; END OF _?OSIntEnter
669
A51 MACRO ASSEMBLER OS_CORE 08/08/2005 12:35:32 PAGE 12
670 ; /*$PAGE*/
671 ; /*
672 ; *****************************************************************************************
****************
673 ; * EXIT ISR
674 ; *
675 ; * Description: This function is used to notify uC/OS-II that you have completed serviving
an ISR. When
676 ; * the last nested ISR has completed, uC/OS-II will call the scheduler to det
ermine whether
677 ; * a new, high-priority task, is ready to run.
678 ; *
679 ; * Arguments : none
680 ; *
681 ; * Returns : none
682 ; *
683 ; * Notes : 1) You MUST invoke OSIntEnter() and OSIntExit() in pair. In other words,
for every call
684 ; * to OSIntEnter() at the beginning of the ISR you MUST have a call to OSI
ntExit() at the
685 ; * end of the ISR.
686 ; * 2) Rescheduling is prevented when the scheduler is locked (see OS_SchedLoc
k())
687 ; *****************************************************************************************
****************
688 ; */
689 ;
690 ; void OSIntExit (void) reentrant
691
---- 692 RSEG ?PR?_?OSIntExit?OS_CORE
0000 693 _?OSIntExit:
694 USING 0
695 ; SOURCE LINE # 172
696 ; {
697 ;
698 ;
699 ;
700 ; if (OSRunning == TRUE) {
701 ; SOURCE LINE # 177
0000 7800 F 702 MOV R0,#LOW (OSRunning)
0002 E6 703 MOV A,@R0
0003 6401 704 XRL A,#01H
0005 6003 705 JZ $ + 5H
0007 020000 F 706 LJMP ?C0009
707 ; OS_ENTER_CRITICAL();
708 ; SOURCE LINE # 178
000A C2AF 709 CLR EA
710 ; if (OSIntNesting > 0) { /* Prevent OSIntNesting from w
rapping */
711 ; SOURCE LINE # 179
000C 900000 F 712 MOV DPTR,#OSIntNesting
000F E0 713 MOVX A,@DPTR
0010 D3 714 SETB C
0011 9400 715 SUBB A,#00H
0013 4003 716 JC ?C0006
717 ; OSIntNesting--;
718 ; SOURCE LINE # 180
0015 E0 719 MOVX A,@DPTR
0016 14 720 DEC A
0017 F0 721 MOVX @DPTR,A
722 ; }
723 ; SOURCE LINE # 181
0018 724 ?C0006:
725 ; if ((OSIntNesting == 0) && (OSLockNesting == 0)) { /* Reschedule only if all ISRs
complete ... */
726 ; SOURCE LINE # 182
A51 MACRO ASSEMBLER OS_CORE 08/08/2005 12:35:32 PAGE 13
0018 900000 F 727 MOV DPTR,#OSIntNesting
001B E0 728 MOVX A,@DPTR
001C 6003 729 JZ $ + 5H
001E 020000 F 730 LJMP ?C0007
0021 900000 F 731 MOV DPTR,#OSLockNesting
0024 E0 732 MOVX A,@DPTR
0025 707C 733 JNZ ?C0007
734 ; OSIntExitY = OSUnMapTbl[OSRdyGrp]; /* ... and not locked.
*/
735 ; SOURCE LINE # 183
0027 900000 F 736 MOV DPTR,#OSRdyGrp
002A E0 737 MOVX A,@DPTR
002B 2400 F 738 ADD A,#LOW (OSUnMapTbl)
002D F582 739 MOV DPL,A
002F E4 740 CLR A
0030 3400 F 741 ADDC A,#HIGH (OSUnMapTbl)
0032 F583 742 MOV DPH,A
0034 E0 743 MOVX A,@DPTR
0035 900000 F 744 MOV DPTR,#OSIntExitY
0038 F0 745 MOVX @DPTR,A
746 ; OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]])
;
747 ; SOURCE LINE # 184
0039 E0 748 MOVX A,@DPTR
003A FF 749 MOV R7,A
003B 2400 F 750 ADD A,#LOW (OSRdyTbl)
003D F582 751 MOV DPL,A
003F E4 752 CLR A
0040 3400 F 753 ADDC A,#HIGH (OSRdyTbl)
0042 F583 754 MOV DPH,A
0044 E0 755 MOVX A,@DPTR
0045 2400 F 756 ADD A,#LOW (OSUnMapTbl)
0047 F582 757 MOV DPL,A
0049 E4 758 CLR A
004A 3400 F 759 ADDC A,#HIGH (OSUnMapTbl)
004C F583 760 MOV DPH,A
004E E0 761 MOVX A,@DPTR
004F FE 762 MOV R6,A
0050 EF 763 MOV A,R7
0051 33 764 RLC A
0052 33 765 RLC A
0053 33 766 RLC A
0054 54F8 767 ANL A,#0F8H
0056 FF 768 MOV R7,A
0057 EE 769 MOV A,R6
0058 2F 770 ADD A,R7
0059 FF 771 MOV R7,A
005A 7800 F 772 MOV R0,#LOW (OSPrioHighRdy)
005C F6 773 MOV @R0,A
774 ; if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task i
s highest rdy */
775 ; SOURCE LINE # 185
005D 18 776 DEC R0
005E E6 777 MOV A,@R0
005F 6F 778 XRL A,R7
0060 6041 779 JZ ?C0007
780 ; OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
781 ; SOURCE LINE # 186
0062 08 782 INC R0
0063 E6 783 MOV A,@R0
0064 75F003 784 MOV B,#03H
0067 A4 785 MUL AB
0068 2400 F 786 ADD A,#LOW (OSTCBPrioTbl)
006A F582 787 MOV DPL,A
006C E4 788 CLR A
006D 3400 F 789 ADDC A,#HIGH (OSTCBPrioTbl)
A51 MACRO ASSEMBLER OS_CORE 08/08/2005 12:35:32 PAGE 14
006F F583 790 MOV DPH,A
0071 E0 791 MOVX A,@DPTR
0072 FB 792 MOV R3,A
0073 A3 793 INC DPTR
0074 E0 794 MOVX A,@DPTR
0075 FA 795 MOV R2,A
0076 A3 796 INC DPTR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -