📄 task_switch.ls1
字号:
0000 C2AF 195 CLR EA
196 ; __asm PUSH ACC //保护当前任务寄存器
0002 C0E0 197 PUSH ACC
198 ; __asm PUSH B
0004 C0F0 199 PUSH B
200 ; __asm PUSH PSW
0006 C0D0 201 PUSH PSW
202 ; __asm PUSH DPL
0008 C082 203 PUSH DPL
204 ; __asm PUSH DPH
000A C083 205 PUSH DPH
206 ; __asm PUSH 0 //0-7为工作寄存器
000C C000 207 PUSH 0
208 ; __asm PUSH 1
000E C001 209 PUSH 1
210 ; __asm PUSH 2
0010 C002 211 PUSH 2
212 ; __asm PUSH 3
0012 C003 213 PUSH 3
214 ; __asm PUSH 4
0014 C004 215 PUSH 4
216 ; __asm PUSH 5
0016 C005 217 PUSH 5
218 ; __asm PUSH 6
0018 C006 219 PUSH 6
220 ; __asm PUSH 7
001A C007 221 PUSH 7
222 ;
223 ; OS_pcb[OS_Current_ID].Task_SP=SP; //保存当前堆栈指针
224 ; SOURCE LINE # 44
001C AF00 F 225 MOV R7,OS_Current_ID
001E EF 226 MOV A,R7
001F 75F005 227 MOV B,#05H
0022 A4 228 MUL AB
0023 2400 F 229 ADD A,#LOW (OS_pcb)
0025 F8 230 MOV R0,A
0026 A681 231 MOV @R0,SP
232 ;
233 ; OS_Current_ID=0; //设置为空闲任务的ID号,优先级最低
234 ; SOURCE LINE # 46
0028 E4 235 CLR A
0029 F500 F 236 MOV OS_Current_ID,A
237 ;
238 ; temp=0x01;
239 ; SOURCE LINE # 48
002B 750001 F 240 MOV temp?041,#01H
241 ; for(i=0;i<MAX_TASK;i++ ) //查找优先级最高的任务
242 ; SOURCE LINE # 49
002E F500 F 243 MOV i?040,A
0030 244 ?C0001:
245 ; {
246 ; SOURCE LINE # 50
247 ; if(OS_Task_List&temp) //判断是否有该任务
248 ; SOURCE LINE # 51
0030 E500 F 249 MOV A,OS_Task_List
0032 5500 F 250 ANL A,temp?041
0034 6027 251 JZ ?C0004
252 ; {
253 ; SOURCE LINE # 52
254 ; if(OS_pcb[i].Suspend==0) //查找未挂起任务
255 ; SOURCE LINE # 53
A51 MACRO ASSEMBLER TASK_SWITCH 01/17/2009 15:09:00 PAGE 5
0036 E500 F 256 MOV A,i?040
0038 75F005 257 MOV B,#05H
003B A4 258 MUL AB
003C 2400 F 259 ADD A,#LOW (OS_pcb+02H)
003E F8 260 MOV R0,A
003F E6 261 MOV A,@R0
0040 701B 262 JNZ ?C0004
263 ; {
264 ; SOURCE LINE # 54
265 ; if(OS_pcb[i].Priority<OS_pcb[OS_Current_ID].Priority) //如果优先级高,则切换之
266 ; SOURCE LINE # 55
0042 AF00 F 267 MOV R7,OS_Current_ID
0044 EF 268 MOV A,R7
0045 75F005 269 MOV B,#05H
0048 A4 270 MUL AB
0049 2400 F 271 ADD A,#LOW (OS_pcb+01H)
004B F9 272 MOV R1,A
004C E500 F 273 MOV A,i?040
004E 75F005 274 MOV B,#05H
0051 A4 275 MUL AB
0052 2400 F 276 ADD A,#LOW (OS_pcb+01H)
0054 F8 277 MOV R0,A
0055 E6 278 MOV A,@R0
0056 C3 279 CLR C
0057 97 280 SUBB A,@R1
0058 5003 281 JNC ?C0004
282 ; {
283 ; SOURCE LINE # 56
284 ; OS_Current_ID=i;
285 ; SOURCE LINE # 57
005A 850000 F 286 MOV OS_Current_ID,i?040
287 ; }
288 ; SOURCE LINE # 58
289 ; }
290 ; SOURCE LINE # 59
291 ; }
292 ; SOURCE LINE # 60
005D 293 ?C0004:
294 ; temp<<=1; //调整temp的值,以检查下一个任务
295 ; SOURCE LINE # 61
005D E500 F 296 MOV A,temp?041
005F 25E0 297 ADD A,ACC
0061 F500 F 298 MOV temp?041,A
299 ; }
300 ; SOURCE LINE # 62
0063 0500 F 301 INC i?040
0065 E500 F 302 MOV A,i?040
0067 B404C6 303 CJNE A,#04H,?C0001
006A 304 ?C0002:
305 ;
306 ; SP=OS_pcb[OS_Current_ID].Task_SP; //任务堆栈指针切换
307 ; SOURCE LINE # 64
006A AF00 F 308 MOV R7,OS_Current_ID
006C EF 309 MOV A,R7
006D 75F005 310 MOV B,#05H
0070 A4 311 MUL AB
0071 2400 F 312 ADD A,#LOW (OS_pcb)
0073 F8 313 MOV R0,A
0074 E6 314 MOV A,@R0
0075 F581 315 MOV SP,A
316 ;
317 ; __asm POP 7 //恢复任务寄存器
0077 D007 318 POP 7
319 ; __asm POP 6
0079 D006 320 POP 6
321 ; __asm POP 5
A51 MACRO ASSEMBLER TASK_SWITCH 01/17/2009 15:09:00 PAGE 6
007B D005 322 POP 5
323 ; __asm POP 4
007D D004 324 POP 4
325 ; __asm POP 3
007F D003 326 POP 3
327 ; __asm POP 2
0081 D002 328 POP 2
329 ; __asm POP 1
0083 D001 330 POP 1
331 ; __asm POP 0
0085 D000 332 POP 0
333 ; __asm POP DPH
0087 D083 334 POP DPH
335 ; __asm POP DPL
0089 D082 336 POP DPL
337 ; __asm POP PSW
008B D0D0 338 POP PSW
339 ; __asm POP B
008D D0F0 340 POP B
341 ; __asm POP ACC
008F D0E0 342 POP ACC
343 ;
344 ; EA=1; //开中断
345 ; SOURCE LINE # 80
0091 D2AF 346 SETB EA
347 ; }
348 ; SOURCE LINE # 81
0093 22 349 RET
350 ; END OF OS_Task_Switch
351
---- 352 CSEG AT 0002BH
002B 020000 F 353 LJMP Timer2ISR
354
355 ; /////////////////////////////////////////////////////////////////////////////////////////
////
356 ;
357 ;
358 ; //////////////////////////////////////////定时器中断服务函数/////////////////////////////
/////
359 ; void Timer2ISR(void) interrupt 5 using 1
360
---- 361 RSEG ?PR?Timer2ISR?TASK_SWITCH
362 USING 1
0000 363 Timer2ISR:
0000 C0E0 364 PUSH ACC
0002 C0F0 365 PUSH B
0004 C0D0 366 PUSH PSW
367 USING 1
0006 75D008 368 MOV PSW,#08H
369 ; SOURCE LINE # 86
370 ;---- Variable 'i?142' assigned to Register 'R7' ----
371 ; {
372 ; unsigned char i;
373 ; unsigned char temp;
374 ;
375 ; EA=0; //关中断
376 ; SOURCE LINE # 91
0009 C2AF 377 CLR EA
378 ;
379 ; __asm PUSH DPL //保护当前任务寄存器,其中ACC,PSW,B寄存器编译器自动压栈
000B C082 380 PUSH DPL
381 ; __asm PUSH DPH //共压入:地址(16位)2字节+寄存器13字节
000D C083 382 PUSH DPH
383 ; __asm PUSH 0
000F C000 384 PUSH 0
385 ; __asm PUSH 1
A51 MACRO ASSEMBLER TASK_SWITCH 01/17/2009 15:09:00 PAGE 7
0011 C001 386 PUSH 1
387 ; __asm PUSH 2
0013 C002 388 PUSH 2
389 ; __asm PUSH 3
0015 C003 390 PUSH 3
391 ; __asm PUSH 4
0017 C004 392 PUSH 4
393 ; __asm PUSH 5
0019 C005 394 PUSH 5
395 ; __asm PUSH 6
001B C006 396 PUSH 6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -