📄 task_switch.lst
字号:
C51 COMPILER V7.06 TASK_SWITCH 02/25/2006 14:24:58 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE TASK_SWITCH
OBJECT MODULE PLACED IN task_switch.OBJ
COMPILER INVOKED BY: f:\Keil\C51\BIN\C51.EXE task_switch.C BROWSE DEBUG OBJECTEXTEND SRC(.\task_switch.SRC)
stmt level source
1 /*******************************************************
2 *************基于51内核的圈圈操作系统*****************
3 本程序只供学习使用,未经作者许可,不得用于其它任何用途
4
5 Task_Switch.c file
6
7 Created by Computer-lov
8 Date: 2005.10.27
9
10 Edit date:2006.2.24
11
12 Version V1.1
13 Copyright(C) Computer-lov 2005-2015
14 All rigths reserved
15
16 ******************************************************/
17
18 #include "AT89X52.h"
19 #include "task_switch.h"
20 #include "MAIN.H"
21 #include "OS_core.h"
22
23 ///////////////////////////////////////////任务切换函数/////////////////////////////////
24 void OS_Task_Switch(void)
25 {
26 1 static unsigned char i; //使用static申明局部变量,避免临时变量使用相同地址
27 1 static unsigned char temp;
28 1
29 1 EA=0; //关中断
30 1 __asm PUSH ACC //保护当前任务寄存器
31 1 __asm PUSH B
32 1 __asm PUSH PSW
33 1 __asm PUSH DPL
34 1 __asm PUSH DPH
35 1 __asm PUSH 0 //0-7为工作寄存器
36 1 __asm PUSH 1
37 1 __asm PUSH 2
38 1 __asm PUSH 3
39 1 __asm PUSH 4
40 1 __asm PUSH 5
41 1 __asm PUSH 6
42 1 __asm PUSH 7
43 1
44 1 OS_pcb[OS_Current_ID].Task_SP=SP; //保存当前堆栈指针
45 1
46 1 OS_Current_ID=0; //设置为空闲任务的ID号,优先级最低
47 1
48 1 temp=0x01;
49 1 for(i=0;i<MAX_TASK;i++) //查找优先级最高的任务
50 1 {
51 2 if(OS_Task_List&temp) //判断是否有该任务
52 2 {
53 3 if(OS_pcb[i].Suspend==0) //查找未挂起任务
54 3 {
55 4 if(OS_pcb[i].Priority<OS_pcb[OS_Current_ID].Priority) //如果优先级高,则切换之
C51 COMPILER V7.06 TASK_SWITCH 02/25/2006 14:24:58 PAGE 2
56 4 {
57 5 OS_Current_ID=i;
58 5 }
59 4 }
60 3 }
61 2 temp<<=1; //调整temp的值,以检查下一个任务
62 2 }
63 1
64 1 SP=OS_pcb[OS_Current_ID].Task_SP; //任务堆栈指针切换
65 1
66 1 __asm POP 7 //恢复任务寄存器
67 1 __asm POP 6
68 1 __asm POP 5
69 1 __asm POP 4
70 1 __asm POP 3
71 1 __asm POP 2
72 1 __asm POP 1
73 1 __asm POP 0
74 1 __asm POP DPH
75 1 __asm POP DPL
76 1 __asm POP PSW
77 1 __asm POP B
78 1 __asm POP ACC
79 1
80 1 EA=1; //开中断
81 1 }
82 /////////////////////////////////////////////////////////////////////////////////////////////
83
84
85 //////////////////////////////////////////定时器中断服务函数//////////////////////////////////
86 void Timer2ISR(void) interrupt 5 using 1
87 {
88 1 unsigned char i;
89 1 unsigned char temp;
90 1
91 1 EA=0; //关中断
92 1
93 1 __asm PUSH DPL //保护当前任务寄存器,其中ACC,PSW,B寄存器编译器自动压栈
94 1 __asm PUSH DPH
95 1 __asm PUSH 0
96 1 __asm PUSH 1
97 1 __asm PUSH 2
98 1 __asm PUSH 3
99 1 __asm PUSH 4
100 1 __asm PUSH 5
101 1 __asm PUSH 6
102 1 __asm PUSH 7
103 1
104 1 TF2=0; //清中断标志TF2
105 1
106 1
107 1 if(!OS_Running) //如果是第一次进入,则调整好堆栈指针位置,使其不返回主函数
108 1 {
109 2 SP-=2; //将堆栈指针下移2,因为从主函数中断时压栈的两个返回地址是无用的
110 2 for(i=1;i<Num_PUSH_bytes+1;i++) //同时将刚被压栈的那几个往下平移2个字节
111 2 {
112 3 ((unsigned char idata *)(SP-Num_PUSH_bytes))[i]=((unsigned char idata *)(SP-Num_PUSH_bytes+2))[i];
113 3 }
114 2 OS_Running=1; //开始运行
115 2 OS_Run_Time=0; //运行总时间清0
116 2 }
117 1
C51 COMPILER V7.06 TASK_SWITCH 02/25/2006 14:24:58 PAGE 3
118 1 OS_Run_Time++; //每一个时钟节拍,运行总时间加1
119 1
120 1 OS_pcb[OS_Current_ID].Task_SP=SP; //保存当前任务堆栈指针
121 1
122 1 OS_Current_ID=0; //设置为空闲任务的ID号,优先级最低
123 1
124 1 temp=0x01;
125 1 for(i=0;i<MAX_TASK;i++) //查找优先级最高的任务
126 1 {
127 2 if(OS_Task_List&temp) //如果此任务存在
128 2 {
129 3 if(OS_pcb[i].Delay!=0) //如果任务需要延时
130 3 {
131 4 OS_pcb[i].Delay--; //延时时间减1
132 4 if(OS_pcb[i].Delay==0) //如果延时时间到
133 4 {
134 5 OS_pcb[i].Suspend=0; //任务解挂起
135 5 }
136 4 }
137 3 if(OS_pcb[i].Suspend==0) //查找未挂起任务
138 3 {
139 4 if(OS_pcb[i].Priority<OS_pcb[OS_Current_ID].Priority) //如果优先级高,则切换之
140 4 {
141 5 OS_Current_ID=i;
142 5 }
143 4 }
144 3 }
145 2 temp<<=1; //调整temp的值,以检查下一个任务
146 2 }
147 1
148 1 SP=OS_pcb[OS_Current_ID].Task_SP; //任务堆栈指针切换
149 1
150 1 __asm POP 7
151 1 __asm POP 6
152 1 __asm POP 5
153 1 __asm POP 4
154 1 __asm POP 3
155 1 __asm POP 2
156 1 __asm POP 1
157 1 __asm POP 0
158 1 __asm POP DPH
159 1 __asm POP DPL //恢复任务寄存器
160 1
161 1 EA=1; //开中断
162 1 }
163 ////////////////////////////////////////////////////////////////////////////////////////////
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 425 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -