📄 task_switch.ls1
字号:
397 ; __asm PUSH 7
001D C007 398 PUSH 7
399 ;
400 ; TF2=0; //清中断标志TF2
401 ; SOURCE LINE # 104
001F C2CF 402 CLR TF2
403 ;
404 ; //第一次从OS_Start()函数进入,SP为OS_pcb[OS_Current_ID].Task_SP
405 ; // 指向OS_Stack[OS_Current_ID]
406 ; //此时栈中:从低开始保存的为OS_Current_ID的任务地址(2字节),
407 ; // OS_Start()的地址(2字节),13个寄存器数据
408 ; //为了中断返回时,不返回OS_Start(),而返回OS_Current_ID任务,需调整Sp
409 ;
410 ; if(!OS_Running) //如果是第一次进入,则调整好堆栈指针位置,使其不返回主函数
411 ; SOURCE LINE # 112
0021 E500 F 412 MOV A,OS_Running
0023 7023 413 JNZ ?C0008
414 ; {
415 ; SOURCE LINE # 113
416 ; SP-=2; //将堆栈指针下移2,因为从主函数中断时压栈的两个返回地址是无用的
417 ; SOURCE LINE # 114
0025 1581 418 DEC SP
0027 1581 419 DEC SP
420 ; for(i=1;i<Num_PUSH_bytes+1;i++) //同时将刚被压栈的那几个往下平移2个字节
421 ; SOURCE LINE # 115
0029 7F01 422 MOV R7,#01H
002B 423 ?C0009:
424 ; {
425 ; SOURCE LINE # 116
426 ; ((unsigned char idata *)(SP-Num_PUSH_bytes))[i]=((unsigned char idata *)(SP-Num_PUSH
_bytes+2))[i];
427 ; SOURCE LINE # 117
002B E581 428 MOV A,SP
002D 24F5 429 ADD A,#0F5H
002F 2F 430 ADD A,R7
0030 F8 431 MOV R0,A
0031 E6 432 MOV A,@R0
0032 FE 433 MOV R6,A
0033 E581 434 MOV A,SP
0035 24F3 435 ADD A,#0F3H
0037 2F 436 ADD A,R7
0038 F8 437 MOV R0,A
0039 A60E 438 MOV @R0,AR6
439 ; }
440 ; SOURCE LINE # 118
003B 0F 441 INC R7
003C BF0EEC 442 CJNE R7,#0EH,?C0009
003F 443 ?C0010:
444 ; OS_Running=1; //开始运行
445 ; SOURCE LINE # 119
003F 750001 F 446 MOV OS_Running,#01H
447 ; OS_Run_Time=0; //运行总时间清0
448 ; SOURCE LINE # 120
0042 750000 F 449 MOV OS_Run_Time,#00H
0045 750000 F 450 MOV OS_Run_Time+01H,#00H
A51 MACRO ASSEMBLER TASK_SWITCH 01/17/2009 15:09:00 PAGE 8
451 ; }
452 ; SOURCE LINE # 121
0048 453 ?C0008:
454 ;
455 ; OS_Run_Time++; //每一个时钟节拍,运行总时间加1
456 ; SOURCE LINE # 123
0048 0500 F 457 INC OS_Run_Time+01H
004A E500 F 458 MOV A,OS_Run_Time+01H
004C 7002 459 JNZ ?C0021
004E 0500 F 460 INC OS_Run_Time
0050 461 ?C0021:
462 ;
463 ; OS_pcb[OS_Current_ID].Task_SP=SP; //保存当前任务堆栈指针
464 ; SOURCE LINE # 125
0050 AF00 F 465 MOV R7,OS_Current_ID
0052 EF 466 MOV A,R7
0053 75F005 467 MOV B,#05H
0056 A4 468 MUL AB
0057 2400 F 469 ADD A,#LOW (OS_pcb)
0059 F8 470 MOV R0,A
005A A681 471 MOV @R0,SP
472 ;
473 ; OS_Current_ID=0; //设置为空闲任务的ID号,优先级最低
474 ; SOURCE LINE # 127
005C 750000 F 475 MOV OS_Current_ID,#00H
476 ;
477 ; temp=0x01;
478 ; SOURCE LINE # 129
479 ;---- Variable 'temp?143' assigned to Register 'R6' ----
005F 7E01 480 MOV R6,#01H
481 ; for(i=0;i<MAX_TASK;i++) //查找优先级最高的任务
482 ; SOURCE LINE # 130
0061 7F00 483 MOV R7,#00H
0063 484 ?C0012:
485 ; {
486 ; SOURCE LINE # 131
487 ; if(OS_Task_List&temp) //如果此任务存在
488 ; SOURCE LINE # 132
0063 E500 F 489 MOV A,OS_Task_List
0065 5E 490 ANL A,R6
0066 604D 491 JZ ?C0015
492 ; {
493 ; SOURCE LINE # 133
494 ; if(OS_pcb[i].Delay!=0) //如果任务需要延时
495 ; SOURCE LINE # 134
0068 EF 496 MOV A,R7
0069 75F005 497 MOV B,#05H
006C A4 498 MUL AB
006D 2400 F 499 ADD A,#LOW (OS_pcb+03H)
006F F8 500 MOV R0,A
0070 E6 501 MOV A,@R0
0071 601E 502 JZ ?C0016
503 ; {
504 ; SOURCE LINE # 135
505 ; OS_pcb[i].Delay--; //延时时间减1
506 ; SOURCE LINE # 136
0073 EF 507 MOV A,R7
0074 75F005 508 MOV B,#05H
0077 A4 509 MUL AB
0078 2400 F 510 ADD A,#LOW (OS_pcb+03H)
007A F8 511 MOV R0,A
007B 16 512 DEC @R0
513 ; if(OS_pcb[i].Delay==0) //如果延时时间到
514 ; SOURCE LINE # 137
007C EF 515 MOV A,R7
007D 75F005 516 MOV B,#05H
A51 MACRO ASSEMBLER TASK_SWITCH 01/17/2009 15:09:00 PAGE 9
0080 A4 517 MUL AB
0081 2400 F 518 ADD A,#LOW (OS_pcb+03H)
0083 F8 519 MOV R0,A
0084 E6 520 MOV A,@R0
0085 700A 521 JNZ ?C0016
522 ; {
523 ; SOURCE LINE # 138
524 ; OS_pcb[i].Suspend=0; //任务解挂起
525 ; SOURCE LINE # 139
0087 EF 526 MOV A,R7
0088 75F005 527 MOV B,#05H
008B A4 528 MUL AB
008C 2400 F 529 ADD A,#LOW (OS_pcb+02H)
008E F8 530 MOV R0,A
008F 7600 531 MOV @R0,#00H
532 ; }
533 ; SOURCE LINE # 140
534 ; }
535 ; SOURCE LINE # 141
0091 536 ?C0016:
537 ; if(OS_pcb[i].Suspend==0) //查找未挂起任务
538 ; SOURCE LINE # 142
0091 EF 539 MOV A,R7
0092 75F005 540 MOV B,#05H
0095 A4 541 MUL AB
0096 2400 F 542 ADD A,#LOW (OS_pcb+02H)
0098 F8 543 MOV R0,A
0099 E6 544 MOV A,@R0
009A 7019 545 JNZ ?C0015
546 ; {
547 ; SOURCE LINE # 143
548 ; if(OS_pcb[i].Priority<OS_pcb[OS_Current_ID].Priority) //如果优先级高,则切换之
549 ; SOURCE LINE # 144
009C AD00 F 550 MOV R5,OS_Current_ID
009E ED 551 MOV A,R5
009F 75F005 552 MOV B,#05H
00A2 A4 553 MUL AB
00A3 2400 F 554 ADD A,#LOW (OS_pcb+01H)
00A5 F9 555 MOV R1,A
00A6 EF 556 MOV A,R7
00A7 75F005 557 MOV B,#05H
00AA A4 558 MUL AB
00AB 2400 F 559 ADD A,#LOW (OS_pcb+01H)
00AD F8 560 MOV R0,A
00AE E6 561 MOV A,@R0
00AF C3 562 CLR C
00B0 97 563 SUBB A,@R1
00B1 5002 564 JNC ?C0015
565 ; {
566 ; SOURCE LINE # 145
567 ; OS_Current_ID=i;
568 ; SOURCE LINE # 146
00B3 8F00 F 569 MOV OS_Current_ID,R7
570 ; }
571 ; SOURCE LINE # 147
572 ; }
573 ; SOURCE LINE # 148
574 ; }
575 ; SOURCE LINE # 149
00B5 576 ?C0015:
577 ; temp<<=1; //调整temp的值,以检查下一个任务
578 ; SOURCE LINE # 150
00B5 EE 579 MOV A,R6
00B6 25E0 580 ADD A,ACC
00B8 FE 581 MOV R6,A
582 ; }
A51 MACRO ASSEMBLER TASK_SWITCH 01/17/2009 15:09:00 PAGE 10
583 ; SOURCE LINE # 151
00B9 0F 584 INC R7
00BA BF04A6 585 CJNE R7,#04H,?C0012
00BD 586 ?C0013:
587 ;
588 ; SP=OS_pcb[OS_Current_ID].Task_SP; //任务堆栈指针切换
589 ; SOURCE LINE # 153
00BD AE00 F 590 MOV R6,OS_Current_ID
00BF EE 591 MOV A,R6
00C0 75F005 592 MOV B,#05H
00C3 A4 593 MUL AB
00C4 2400 F 594 ADD A,#LOW (OS_pcb)
00C6 F8 595 MOV R0,A
00C7 E6 596 MOV A,@R0
00C8 F581 597 MOV SP,A
598 ;
599 ; __asm POP 7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -