📄 os_core.ls1
字号:
0082 E500 F 856 MOV A,prio?245
0084 13 857 RRC A
0085 13 858 RRC A
0086 13 859 RRC A
0087 541F 860 ANL A,#01FH
0089 FF 861 MOV R7,A
008A 900000 F 862 MOV DPTR,#OSMapTbl
008D 93 863 MOVC A,@A+DPTR
008E 4200 F 864 ORL OSRdyGrp,A
865 ; OSRdyTbl[prio>>3] |= OSMapTbl[prio&0x07]; //prio&0x07-->prio%8
866 ; SOURCE LINE # 176
0090 7400 F 867 MOV A,#LOW (OSRdyTbl)
0092 2F 868 ADD A,R7
0093 F8 869 MOV R0,A
0094 E6 870 MOV A,@R0
0095 FF 871 MOV R7,A
0096 E500 F 872 MOV A,prio?245
0098 5407 873 ANL A,#07H
009A 93 874 MOVC A,@A+DPTR
009B 4F 875 ORL A,R7
009C F6 876 MOV @R0,A
877 ;
878 ; //堆栈初始化
879 ; //OSTaskStkInit(task, prio);
880 ; pstack=Tasks_TCB[prio].stk;
881 ; SOURCE LINE # 180
009D E500 F 882 MOV A,prio?245
009F 75F00D 883 MOV B,#0DH
00A2 A4 884 MUL AB
00A3 2400 F 885 ADD A,#LOW (Tasks_TCB+06H)
00A5 F8 886 MOV R0,A
00A6 08 887 INC R0
00A7 E6 888 MOV A,@R0
00A8 FA 889 MOV R2,A
00A9 08 890 INC R0
00AA E6 891 MOV A,@R0
00AB AE02 892 MOV R6,AR2
00AD 8E00 F 893 MOV pstack?248,R6
00AF F500 F 894 MOV pstack?248+01H,A
A51 MACRO ASSEMBLER OS_CORE 06/06/2008 11:39:27 PAGE 15
895 ;
896 ; *pstack++ = (uint8)task; //任务低地址进栈
897 ; SOURCE LINE # 182
00B1 A900 F 898 MOV R1,task?244+02H
00B3 AF01 899 MOV R7,AR1
00B5 0500 F 900 INC pstack?248+01H
00B7 E500 F 901 MOV A,pstack?248+01H
00B9 AC00 F 902 MOV R4,pstack?248
00BB 7002 903 JNZ ?C0031
00BD 0500 F 904 INC pstack?248
00BF 905 ?C0031:
00BF 14 906 DEC A
00C0 F582 907 MOV DPL,A
00C2 8C83 908 MOV DPH,R4
00C4 EF 909 MOV A,R7
00C5 F0 910 MOVX @DPTR,A
911 ; *pstack++ = (uint16)task>>8; //任务高地址进栈
912 ; SOURCE LINE # 183
00C6 E500 F 913 MOV A,task?244+01H
00C8 FF 914 MOV R7,A
00C9 0500 F 915 INC pstack?248+01H
00CB E500 F 916 MOV A,pstack?248+01H
00CD AC00 F 917 MOV R4,pstack?248
00CF 7002 918 JNZ ?C0032
00D1 0500 F 919 INC pstack?248
00D3 920 ?C0032:
00D3 14 921 DEC A
00D4 F582 922 MOV DPL,A
00D6 8C83 923 MOV DPH,R4
00D8 EF 924 MOV A,R7
00D9 F0 925 MOVX @DPTR,A
926 ; for(i=0; i<Tasks_TCB[prio].size; i++)//初始化清空堆栈
927 ; SOURCE LINE # 184
928 ;---- Variable 'i?249' assigned to Register 'R6/R7' ----
00DA E4 929 CLR A
00DB FF 930 MOV R7,A
00DC FE 931 MOV R6,A
00DD 932 ?C0007:
00DD E500 F 933 MOV A,prio?245
00DF 75F00D 934 MOV B,#0DH
00E2 A4 935 MUL AB
00E3 2400 F 936 ADD A,#LOW (Tasks_TCB+09H)
00E5 F8 937 MOV R0,A
00E6 E6 938 MOV A,@R0
00E7 FC 939 MOV R4,A
00E8 08 940 INC R0
00E9 E6 941 MOV A,@R0
00EA FD 942 MOV R5,A
00EB C3 943 CLR C
00EC EF 944 MOV A,R7
00ED 9D 945 SUBB A,R5
00EE EE 946 MOV A,R6
00EF 9C 947 SUBB A,R4
00F0 5018 948 JNC ?C0008
949 ; {
950 ; SOURCE LINE # 185
951 ; *pstack++ = 0;
952 ; SOURCE LINE # 186
00F2 0500 F 953 INC pstack?248+01H
00F4 E500 F 954 MOV A,pstack?248+01H
00F6 AC00 F 955 MOV R4,pstack?248
00F8 7002 956 JNZ ?C0033
00FA 0500 F 957 INC pstack?248
00FC 958 ?C0033:
00FC 14 959 DEC A
00FD F582 960 MOV DPL,A
A51 MACRO ASSEMBLER OS_CORE 06/06/2008 11:39:27 PAGE 16
00FF 8C83 961 MOV DPH,R4
0101 E4 962 CLR A
0102 F0 963 MOVX @DPTR,A
964 ; }
965 ; SOURCE LINE # 187
0103 0F 966 INC R7
0104 BF0001 967 CJNE R7,#00H,?C0034
0107 0E 968 INC R6
0108 969 ?C0034:
0108 80D3 970 SJMP ?C0007
010A 971 ?C0008:
972 ; return (prio);
973 ; SOURCE LINE # 188
010A AF00 F 974 MOV R7,prio?245
010C 8002 975 SJMP ?C0010
976 ; }
977 ; SOURCE LINE # 189
010E 978 ?C0006:
979 ; //OS_EXIT_CRITICAL();
980 ; // IrqAll_Enable(); //总中断允许 IrqT0_Enable(); //打开T0中断允许
981 ; return (0);
982 ; SOURCE LINE # 192
010E 7F00 983 MOV R7,#00H
984 ; }
985 ; SOURCE LINE # 193
0110 986 ?C0010:
0110 D0D0 987 POP PSW
0112 92AF 988 MOV EA,C
0114 22 989 RET
990 ; END OF _os_tsk_create_user
991
992 ;
993 ; #ifndef OS_TASK_SWITCH
994 ; //功能描述: 系统时钟中断服务函数
995 ; //#pragma disable //禁止所有中断
996 ; void OSTickISR(void) interrupt 1 //OS_TIME_ISR
997 ; {uint8 data IEtemp;
998 ;
999 ; //TH0=T0H_COUNTER;
1000 ; //TL0=T0L_COUNTER;
1001 ;
1002 ; IEtemp=IE;//保存中断
1003 ; OS_AllIRQ_Unable(); //总中断禁止
1004 ;
1005 ; //IE &= B0000_0000; //IE &= B0000_0001; //保留外部中断原来状态,屏蔽掉其他中断
1006 ;
1007 ;
1008 ; //#if EN_TIMER_SHARING > 0
1009 ; if(TH0==0)//==0说明是定时器溢出中断,!=0表示是软件设置的定时器中断
1010 ; {
1011 ; TH0=T0H_COUNTER;
1012 ; TL0=T0L_COUNTER;
1013 ; OSTimeTick(); //调用系统时钟处理函数
1014 ; }//
1015 ;
1016 ; //#else
1017 ; // OSIntSendSignal(TIME_ISR_TASK_ID); // 唤醒ID为TIME_ISR_TASK_ID的任务
1018 ; //#endif
1019 ;
1020 ;
1021 ; OSIntExit(); //在完全退出中断时,才进行任务切换
1022 ;
1023 ; //OS_AllIRQ_Enable(); //总中断允许
1024 ; IE=IEtemp; //恢复所有中断状态
1025 ; }
1026 ; #else
A51 MACRO ASSEMBLER OS_CORE 06/06/2008 11:39:27 PAGE 17
1027 ;
1028 ; #endif
1029 ;
1030 ; /*
1031 ; 堆栈保存内容:
1032 ; 数据堆栈+函数地址+特殊功能积存器
1033 ;
1034 ; //功能描述: 中断退出处理函数,在此进行中断后的任务切换
1035 ; //IRQ_Stack_Bottom任务中断后的堆栈栈顶
1036 ; //在退出中断时,不让进栈的数据出栈。在完全退出中断时,才进行任务切换,
1037 ; 1.1 保存当前任务堆栈
1038 ; 1.2 保存任务特殊功能寄存器
1039 ; 1.3 保存任务堆栈+任务特殊功能寄存器->堆栈备份空间
1040 ; 1.4 切换任务
1041 ; 2.1 从堆栈备份空间->恢复新的就绪的任务的堆栈
1042 ; 2.2 恢复任务特殊功能寄存器
1043 ; 2.3 将新任务原来断点地址压入堆栈
1044 ; */
1045 ; void OSIntExit(void) SMALL
1046
---- 1047 RSEG ?PR?OSIntExit?OS_CORE
0000 1048 OSIntExit:
1049 USING 0
1050 ; SOURCE LINE # 247
1051 ; {char idata * stack_bottom;
1052 ; char xdata * stack_bottom_bak;
1053 ; //uint16 addr;
1054 ; uint16 old_addr;
1055 ; uint8 old_taskid;//
1056 ;
1057 ; old_taskid=OSCurrentTaskID;
1058 ; SOURCE LINE # 254
0000 850000 F 1059 MOV old_taskid?353,OSCurrentTaskID
1060 ; OSFindNextRunningTask(); //查找下一个就绪的任务
1061 ; SOURCE LINE # 255
0003 120000 F 1062 LCALL OSFindNextRunningTask
1063 ; if(old_taskid==OSCurrentTaskID) //任务不切换
1064 ; SOURCE LINE # 256
0006 E500 F 1065 MOV A,old_taskid?353
0008 6500 F 1066 XRL A,OSCurrentTaskID
000A 7003 1067 JNZ $ + 5H
000C 020000 F 1068 LJMP ?C0012
000F 1069 ?C0011:
1070 ; return;
1071 ;
1072 ; //系统不备份调用本函数压入的堆栈
1073 ; old_addr=Read_data(SP--); //读出刚才压入堆栈的函数地址.高地址
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -