📄 task_switch.ls1
字号:
0048 A4 250 MUL AB
0049 2400 F 251 ADD A,#LOW (OS_pcb+01H)
004B F9 252 MOV R1,A
004C E500 F 253 MOV A,i?040
004E 75F005 254 MOV B,#05H
0051 A4 255 MUL AB
A51 MACRO ASSEMBLER TASK_SWITCH 02/25/2006 14:24:58 PAGE 5
0052 2400 F 256 ADD A,#LOW (OS_pcb+01H)
0054 F8 257 MOV R0,A
0055 E6 258 MOV A,@R0
0056 C3 259 CLR C
0057 97 260 SUBB A,@R1
0058 5003 261 JNC ?C0004
262 ; {
263 ; SOURCE LINE # 56
264 ; OS_Current_ID=i;
265 ; SOURCE LINE # 57
005A 850000 F 266 MOV OS_Current_ID,i?040
267 ; }
268 ; SOURCE LINE # 58
269 ; }
270 ; SOURCE LINE # 59
271 ; }
272 ; SOURCE LINE # 60
005D 273 ?C0004:
274 ; temp<<=1; //调整temp的值,以检查下一个任务
275 ; SOURCE LINE # 61
005D E500 F 276 MOV A,temp?041
005F 25E0 277 ADD A,ACC
0061 F500 F 278 MOV temp?041,A
279 ; }
280 ; SOURCE LINE # 62
0063 0500 F 281 INC i?040
0065 E500 F 282 MOV A,i?040
0067 B405C6 283 CJNE A,#05H,?C0001
006A 284 ?C0002:
285 ;
286 ; SP=OS_pcb[OS_Current_ID].Task_SP; //任务堆栈指针切换
287 ; SOURCE LINE # 64
006A AF00 F 288 MOV R7,OS_Current_ID
006C EF 289 MOV A,R7
006D 75F005 290 MOV B,#05H
0070 A4 291 MUL AB
0071 2400 F 292 ADD A,#LOW (OS_pcb)
0073 F8 293 MOV R0,A
0074 E6 294 MOV A,@R0
0075 F581 295 MOV SP,A
296 ;
297 ; __asm POP 7 //恢复任务寄存器
0077 D007 298 POP 7
299 ; __asm POP 6
0079 D006 300 POP 6
301 ; __asm POP 5
007B D005 302 POP 5
303 ; __asm POP 4
007D D004 304 POP 4
305 ; __asm POP 3
007F D003 306 POP 3
307 ; __asm POP 2
0081 D002 308 POP 2
309 ; __asm POP 1
0083 D001 310 POP 1
311 ; __asm POP 0
0085 D000 312 POP 0
313 ; __asm POP DPH
0087 D083 314 POP DPH
315 ; __asm POP DPL
0089 D082 316 POP DPL
317 ; __asm POP PSW
008B D0D0 318 POP PSW
319 ; __asm POP B
008D D0F0 320 POP B
321 ; __asm POP ACC
A51 MACRO ASSEMBLER TASK_SWITCH 02/25/2006 14:24:58 PAGE 6
008F D0E0 322 POP ACC
323 ;
324 ; EA=1; //开中断
325 ; SOURCE LINE # 80
0091 D2AF 326 SETB EA
327 ; }
328 ; SOURCE LINE # 81
0093 22 329 RET
330 ; END OF OS_Task_Switch
331
---- 332 CSEG AT 0002BH
002B 020000 F 333 LJMP Timer2ISR
334
335 ; /////////////////////////////////////////////////////////////////////////////////////////
////
336 ;
337 ;
338 ; //////////////////////////////////////////定时器中断服务函数/////////////////////////////
/////
339 ; void Timer2ISR(void) interrupt 5 using 1
340
---- 341 RSEG ?PR?Timer2ISR?TASK_SWITCH
342 USING 1
0000 343 Timer2ISR:
0000 C0E0 344 PUSH ACC
0002 C0F0 345 PUSH B
0004 C0D0 346 PUSH PSW
347 USING 1
0006 75D008 348 MOV PSW,#08H
349 ; SOURCE LINE # 86
350 ;---- Variable 'i?142' assigned to Register 'R7' ----
351 ; {
352 ; unsigned char i;
353 ; unsigned char temp;
354 ;
355 ; EA=0; //关中断
356 ; SOURCE LINE # 91
0009 C2AF 357 CLR EA
358 ;
359 ; __asm PUSH DPL //保护当前任务寄存器,其中ACC,PSW,B寄存器编译器自动压栈
000B C082 360 PUSH DPL
361 ; __asm PUSH DPH
000D C083 362 PUSH DPH
363 ; __asm PUSH 0
000F C000 364 PUSH 0
365 ; __asm PUSH 1
0011 C001 366 PUSH 1
367 ; __asm PUSH 2
0013 C002 368 PUSH 2
369 ; __asm PUSH 3
0015 C003 370 PUSH 3
371 ; __asm PUSH 4
0017 C004 372 PUSH 4
373 ; __asm PUSH 5
0019 C005 374 PUSH 5
375 ; __asm PUSH 6
001B C006 376 PUSH 6
377 ; __asm PUSH 7
001D C007 378 PUSH 7
379 ;
380 ; TF2=0; //清中断标志TF2
381 ; SOURCE LINE # 104
001F C2CF 382 CLR TF2
383 ;
384 ;
385 ; if(!OS_Running) //如果是第一次进入,则调整好堆栈指针位置,使其不返回主函数
A51 MACRO ASSEMBLER TASK_SWITCH 02/25/2006 14:24:58 PAGE 7
386 ; SOURCE LINE # 107
0021 E500 F 387 MOV A,OS_Running
0023 7023 388 JNZ ?C0008
389 ; {
390 ; SOURCE LINE # 108
391 ; SP-=2; //将堆栈指针下移2,因为从主函数中断时压栈的两个返回地址是无用的
392 ; SOURCE LINE # 109
0025 1581 393 DEC SP
0027 1581 394 DEC SP
395 ; for(i=1;i<Num_PUSH_bytes+1;i++) //同时将刚被压栈的那几个往下平移2个字节
396 ; SOURCE LINE # 110
0029 7F01 397 MOV R7,#01H
002B 398 ?C0009:
399 ; {
400 ; SOURCE LINE # 111
401 ; ((unsigned char idata *)(SP-Num_PUSH_bytes))[i]=((unsigned char idata *)(SP-Num_PUSH
_bytes+2))[i];
402 ; SOURCE LINE # 112
002B E581 403 MOV A,SP
002D 24F5 404 ADD A,#0F5H
002F 2F 405 ADD A,R7
0030 F8 406 MOV R0,A
0031 E6 407 MOV A,@R0
0032 FE 408 MOV R6,A
0033 E581 409 MOV A,SP
0035 24F3 410 ADD A,#0F3H
0037 2F 411 ADD A,R7
0038 F8 412 MOV R0,A
0039 A60E 413 MOV @R0,AR6
414 ; }
415 ; SOURCE LINE # 113
003B 0F 416 INC R7
003C BF0EEC 417 CJNE R7,#0EH,?C0009
003F 418 ?C0010:
419 ; OS_Running=1; //开始运行
420 ; SOURCE LINE # 114
003F 750001 F 421 MOV OS_Running,#01H
422 ; OS_Run_Time=0; //运行总时间清0
423 ; SOURCE LINE # 115
0042 750000 F 424 MOV OS_Run_Time,#00H
0045 750000 F 425 MOV OS_Run_Time+01H,#00H
426 ; }
427 ; SOURCE LINE # 116
0048 428 ?C0008:
429 ;
430 ; OS_Run_Time++; //每一个时钟节拍,运行总时间加1
431 ; SOURCE LINE # 118
0048 0500 F 432 INC OS_Run_Time+01H
004A E500 F 433 MOV A,OS_Run_Time+01H
004C 7002 434 JNZ ?C0021
004E 0500 F 435 INC OS_Run_Time
0050 436 ?C0021:
437 ;
438 ; OS_pcb[OS_Current_ID].Task_SP=SP; //保存当前任务堆栈指针
439 ; SOURCE LINE # 120
0050 AF00 F 440 MOV R7,OS_Current_ID
0052 EF 441 MOV A,R7
0053 75F005 442 MOV B,#05H
0056 A4 443 MUL AB
0057 2400 F 444 ADD A,#LOW (OS_pcb)
0059 F8 445 MOV R0,A
005A A681 446 MOV @R0,SP
447 ;
448 ; OS_Current_ID=0; //设置为空闲任务的ID号,优先级最低
449 ; SOURCE LINE # 122
005C 750000 F 450 MOV OS_Current_ID,#00H
A51 MACRO ASSEMBLER TASK_SWITCH 02/25/2006 14:24:58 PAGE 8
451 ;
452 ; temp=0x01;
453 ; SOURCE LINE # 124
454 ;---- Variable 'temp?143' assigned to Register 'R6' ----
005F 7E01 455 MOV R6,#01H
456 ; for(i=0;i<MAX_TASK;i++) //查找优先级最高的任务
457 ; SOURCE LINE # 125
0061 7F00 458 MOV R7,#00H
0063 459 ?C0012:
460 ; {
461 ; SOURCE LINE # 126
462 ; if(OS_Task_List&temp) //如果此任务存在
463 ; SOURCE LINE # 127
0063 E500 F 464 MOV A,OS_Task_List
0065 5E 465 ANL A,R6
0066 604D 466 JZ ?C0015
467 ; {
468 ; SOURCE LINE # 128
469 ; if(OS_pcb[i].Delay!=0) //如果任务需要延时
470 ; SOURCE LINE # 129
0068 EF 471 MOV A,R7
0069 75F005 472 MOV B,#05H
006C A4 473 MUL AB
006D 2400 F 474 ADD A,#LOW (OS_pcb+03H)
006F F8 475 MOV R0,A
0070 E6 476 MOV A,@R0
0071 601E 477 JZ ?C0016
478 ; {
479 ; SOURCE LINE # 130
480 ; OS_pcb[i].Delay--; //延时时间减1
481 ; SOURCE LINE # 131
0073 EF 482 MOV A,R7
0074 75F005 483 MOV B,#05H
0077 A4 484 MUL AB
0078 2400 F 485 ADD A,#LOW (OS_pcb+03H)
007A F8 486 MOV R0,A
007B 16 487 DEC @R0
488 ; if(OS_pcb[i].Delay==0) //如果延时时间到
489 ; SOURCE LINE # 132
007C EF 490 MOV A,R7
007D 75F005 491 MOV B,#05H
0080 A4 492 MUL AB
0081 2400 F 493 ADD A,#LOW (OS_pcb+03H)
0083 F8 494 MOV R0,A
0084 E6 495 MOV A,@R0
0085 700A 496 JNZ ?C0016
497 ; {
498 ; SOURCE LINE # 133
499 ; OS_pcb[i].Suspend=0; //任务解挂起
500 ; SOURCE LINE # 134
0087 EF 501 MOV A,R7
0088 75F005 502 MOV B,#05H
008B A4 503 MUL AB
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -