📄 os_core.ls1
字号:
004B 33 789 RLC A
004C 33 790 RLC A
004D 54F8 791 ANL A,#0F8H
004F FF 792 MOV R7,A
0050 EE 793 MOV A,R6
0051 2F 794 ADD A,R7
0052 FF 795 MOV R7,A
0053 900000 F 796 MOV DPTR,#OSPrioHighRdy
0056 F0 797 MOVX @DPTR,A
798 ; if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task i
s highest rdy */
799 ; SOURCE LINE # 187
0057 900000 F 800 MOV DPTR,#OSPrioCur
005A E0 801 MOVX A,@DPTR
005B 6F 802 XRL A,R7
005C 6036 803 JZ ?C0007
804 ; OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
805 ; SOURCE LINE # 188
005E 900000 F 806 MOV DPTR,#OSPrioHighRdy
0061 E0 807 MOVX A,@DPTR
0062 75F003 808 MOV B,#03H
0065 A4 809 MUL AB
0066 2400 F 810 ADD A,#LOW (OSTCBPrioTbl)
0068 F582 811 MOV DPL,A
006A E4 812 CLR A
006B 3400 F 813 ADDC A,#HIGH (OSTCBPrioTbl)
006D F583 814 MOV DPH,A
006F 120000 F 815 LCALL ?C?PLDXDATA
0072 900000 F 816 MOV DPTR,#OSTCBHighRdy
0075 120000 F 817 LCALL ?C?PSTXDATA
818 ; OSCtxSwCtr++; /* Keep track of the number of
ctx switches */
819 ; SOURCE LINE # 189
0078 900000 F 820 MOV DPTR,#OSCtxSwCtr
007B 120000 F 821 LCALL ?C?LLDXDATA
007E EF 822 MOV A,R7
007F 2401 823 ADD A,#01H
0081 FF 824 MOV R7,A
0082 E4 825 CLR A
0083 3E 826 ADDC A,R6
0084 FE 827 MOV R6,A
0085 E4 828 CLR A
0086 3D 829 ADDC A,R5
0087 FD 830 MOV R5,A
0088 E4 831 CLR A
0089 3C 832 ADDC A,R4
008A FC 833 MOV R4,A
008B 900000 F 834 MOV DPTR,#OSCtxSwCtr
008E 120000 F 835 LCALL ?C?LSTXDATA
836 ; OSIntCtxSw(); /* Perform interrupt level ctx
switch */
837 ; SOURCE LINE # 190
0091 120000 F 838 LCALL _?OSIntCtxSw
839 ; }
840 ; SOURCE LINE # 191
841 ; }
842 ; SOURCE LINE # 192
0094 843 ?C0007:
844 ; OS_EXIT_CRITICAL();
845 ; SOURCE LINE # 193
0094 D2AF 846 SETB EA
847 ; }
848 ; SOURCE LINE # 194
849 ; }
850 ; SOURCE LINE # 195
0096 851 ?C0009:
A51 MACRO ASSEMBLER OS_CORE 05/17/2005 11:19:50 PAGE 15
0096 22 852 RET
853 ; END OF _?OSIntExit
854
855 ; /*$PAGE*/
856 ; /*
857 ; *****************************************************************************************
****************
858 ; * PREVENT SCHEDULING
859 ; *
860 ; * Description: This function is used to prevent rescheduling to take place. This allows
your application
861 ; * to prevent context switches until you are ready to permit context switchin
g.
862 ; *
863 ; * Arguments : none
864 ; *
865 ; * Returns : none
866 ; *
867 ; * Notes : 1) You MUST invoke OSSchedLock() and OSSchedUnlock() in pair. In other wo
rds, for every
868 ; * call to OSSchedLock() you MUST have a call to OSSchedUnlock().
869 ; *****************************************************************************************
****************
870 ; */
871 ;
872 ; #if OS_SCHED_LOCK_EN > 0
873 ; void OSSchedLock (void) LG_REENTRANT
874 ; {
875 ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status regis
ter */
876 ; OS_CPU_SR cpu_sr;
877 ; #endif
878 ;
879 ;
880 ; if (OSRunning == TRUE) { /* Make sure multitasking is running
*/
881 ; OS_ENTER_CRITICAL();
882 ; if (OSLockNesting < 255) { /* Prevent OSLockNesting from wrapping b
ack to 0 */
883 ; OSLockNesting++; /* Increment lock nesting level
*/
884 ; }
885 ; OS_EXIT_CRITICAL();
886 ; }
887 ; }
888 ; #endif
889 ;
890 ; /*$PAGE*/
891 ; /*
892 ; *****************************************************************************************
****************
893 ; * ENABLE SCHEDULING
894 ; *
895 ; * Description: This function is used to re-allow rescheduling.
896 ; *
897 ; * Arguments : none
898 ; *
899 ; * Returns : none
900 ; *
901 ; * Notes : 1) You MUST invoke OSSchedLock() and OSSchedUnlock() in pair. In other wo
rds, for every
902 ; * call to OSSchedLock() you MUST have a call to OSSchedUnlock().
903 ; *****************************************************************************************
****************
904 ; */
905 ;
A51 MACRO ASSEMBLER OS_CORE 05/17/2005 11:19:50 PAGE 16
906 ; #if OS_SCHED_LOCK_EN > 0
907 ; void OSSchedUnlock (void) LG_REENTRANT
908 ; {
909 ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU st
atus register */
910 ; OS_CPU_SR cpu_sr;
911 ; #endif
912 ;
913 ;
914 ; if (OSRunning == TRUE) { /* Make sure multitasking
is running */
915 ; OS_ENTER_CRITICAL();
916 ; if (OSLockNesting > 0) { /* Do not decrement if alr
eady 0 */
917 ; OSLockNesting--; /* Decrement lock nesting
level */
918 ; if ((OSLockNesting == 0) && (OSIntNesting == 0)) { /* See if sched. enabled a
nd not an ISR */
919 ; OS_EXIT_CRITICAL();
920 ; OS_Sched(); /* See if a HPT is ready
*/
921 ; } else {
922 ; OS_EXIT_CRITICAL();
923 ; }
924 ; } else {
925 ; OS_EXIT_CRITICAL();
926 ; }
927 ; }
928 ; }
929 ; #endif
930 ;
931 ; /*$PAGE*/
932 ; /*
933 ; *****************************************************************************************
****************
934 ; * START MULTITASKING
935 ; *
936 ; * Description: This function is used to start the multitasking process which lets uC/OS-I
I manages the
937 ; * task that you have created. Before you can call OSStart(), you MUST have
called OSInit()
938 ; * and you MUST have created at least one task.
939 ; *
940 ; * Arguments : none
941 ; *
942 ; * Returns : none
943 ; *
944 ; * Note : OSStartHighRdy() MUST:
945 ; * a) Call OSTaskSwHook() then,
946 ; * b) Set OSRunning to TRUE.
947 ; * c) Load the context of the task pointed to by OSTCBHighRdy.
948 ; * d_ Execute the task.
949 ; *****************************************************************************************
****************
950 ; */
951 ;
952 ; void OSStart (void) LG_REENTRANT
953
---- 954 RSEG ?PR?_?OSStart?OS_CORE
0000 955 _?OSStart:
956 USING 0
957 ; SOURCE LINE # 293
0000 90FFFE 958 MOV DPTR,#0FFFEH
0003 120000 F 959 LCALL ?C?ADDXBP
960 ; {
961 ; INT8U y;
A51 MACRO ASSEMBLER OS_CORE 05/17/2005 11:19:50 PAGE 17
962 ; INT8U x;
963 ;
964 ; if (OSRunning == FALSE) {
965 ; SOURCE LINE # 298
0006 20006A F 966 JB OSRunning,?C0011
967 ; y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task prio
rity number */
968 ; SOURCE LINE # 299
0009 900000 F 969 MOV DPTR,#OSRdyGrp
000C E0 970 MOVX A,@DPTR
000D 2400 F 971 ADD A,#LOW (OSUnMapTbl)
000F F582 972 MOV DPL,A
0011 E4 973 CLR A
0012 3400 F 974 ADDC A,#HIGH (OSUnMapTbl)
0014 F583 975
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -