📄 conf_tny.lst
字号:
420 ; Perform a Task-Switch
421 ; void os_switch_task (void)
422 ; uchar i;
423 ; uchar limit;
424
425 ;---- Variable 'current' assigned to Register 'R6' ----
426 ;---- Variable 'next' assigned to Register 'R7' ----
427 ;---- Variable 'i' assigned to Register 'R0' ----
428 ;---- Variable 'limit' assigned to Register 'R5' ----
429 ;
430 ;------------------------------------------------
431
007C 432 os_switch_task:
433
434 IF (CODE_BANKING <> 0)
PUSH ?B_CURRENTBANK
ENDIF
437
007C 438 os_switch_task1:
439
440 ; next = current;
441 IF (TIMESHARING <> 0)
007C D200 F 442 SETB ?RTX_TS_DELAY ; Delay Task Switching
443 ENDIF
007E E50C 444 MOV A,?RTX_CURRENTTASK
0080 FF 445 MOV R7,A
446 ; while (1) {
0081 23 447 RL A
0082 2400 F 448 ADD A,#?RTX?TASKSTATE?S+1
0084 F8 449 MOV R0,A
0085 450 ?C0001:
451 ; if (++next == MAXTASKN+1) next = 0;
0085 0F 452 INC R7
0086 08 453 INC R0
0087 08 454 INC R0
455 IF (CPU_IDLE_CODE)
0088 EF 456 MOV A,R7
0089 B50C06 457 CJNE A,?RTX_CURRENTTASK,NoIDLE
008C 100003 F 458 JBC ?RTX_ISR_SIG,NoIDLE
A51 MACRO ASSEMBLER CONF_TNY 12/27/2008 15:34:43 PAGE 8
459 CPU_IDLE ; CPU sleep
0092 461 NoIDLE:
462 ENDIF
0092 BF0004 F 463 CJNE R7,#?RTX_MAXTASKN+1,?C0003
0095 7F00 464 MOV R7,#0
0097 7800 F 465 MOV R0,#?RTX?TASKSTATE?S+1
0099 466 ?C0003:
467 ; if (STATE[next].st & K_READY) break;
0099 E6 468 MOV A,@R0
009A 30E4E8 469 JNB ACC.B_READY,?C0001
470 ; }
471 ;
472
473 PUBLIC ?RTX_NEXTID
474 PUBLIC ?RTX_NEXTTASK
475
0007 476 ?RTX_NEXTID EQU AR7
009D 00 477 ?RTX_NEXTTASK: NOP ; for Debugging
478
479 ; while (current < next) {
009E 480 ?C0005:
009E E50C 481 MOV A,?RTX_CURRENTTASK
00A0 C3 482 CLR C
00A1 9F 483 SUBB A,R7
00A2 5020 484 JNC ?C0011
485
486 ; current++;
00A4 050C 487 INC ?RTX_CURRENTTASK
488 ; i = STKP[current];
00A6 7400 F 489 MOV A,#?RTX?TASKSP?S
00A8 250C 490 ADD A,?RTX_CURRENTTASK
00AA F8 491 MOV R0,A
00AB E6 492 MOV A,@R0
00AC FD 493 MOV R5,A
494 ; STKP[current] = SP;
00AD A681 495 MOV @R0,SP
496 ; if (current == MAXTASKN) limit = RAMTOP;
00AF 08 497 INC R0
00B0 E6 498 MOV A,@R0
00B1 AE0C 499 MOV R6,?RTX_CURRENTTASK
00B3 BE0002 F 500 CJNE R6,#?RTX_MAXTASKN,?C0007
00B6 74FF 501 MOV A,#RAMTOP
00B8 502 ?C0007:
00B8 CD 503 XCH A,R5
00B9 F8 504 MOV R0,A
505 ; else limit = STKP[current+1];
506 ;
507 ; while (i != limit) {
00BA 508 ?C0009:
00BA E8 509 MOV A,R0
00BB 6D 510 XRL A,R5
00BC 60E0 511 JZ ?C0005
512 ; SP++;
513 ; i++;
514 ; STACK[SP] = STACK[i];
00BE 08 515 INC R0
00BF E6 516 MOV A,@R0
00C0 C0E0 517 PUSH ACC
00C2 80F6 518 SJMP ?C0009
519 ; }
520 ; }
00C4 521 ?C0011:
522 ;
523 ; while (current > next) {
00C4 E50C 524 MOV A,?RTX_CURRENTTASK
00C6 D3 525 SETB C
A51 MACRO ASSEMBLER CONF_TNY 12/27/2008 15:34:43 PAGE 9
00C7 9F 526 SUBB A,R7
00C8 4027 527 JC ?C0012
528
00CA E50C 529 MOV A,?RTX_CURRENTTASK
00CC 2400 F 530 ADD A,#?RTX?TASKSP?S+1
00CE F8 531 MOV R0,A
00CF E6 532 MOV A,@R0
533 ; if (current == (MAXTASKN)) i = RAMTOP;
534 ; else i = STKP[current+1];
00D0 AE0C 535 MOV R6,?RTX_CURRENTTASK
00D2 BE0002 F 536 CJNE R6,#?RTX_MAXTASKN,?C0013
00D5 74FF 537 MOV A,#RAMTOP
00D7 538 ?C0013:
00D7 FD 539 MOV R5,A
540 ; limit = STKP[current];
00D8 18 541 DEC R0
00D9 E6 542 MOV A,@R0
00DA CD 543 XCH A,R5
00DB F8 544 MOV R0,A
545 ;
546 ; while (SP != limit) {
00DC 547 ?C0015:
00DC E581 548 MOV A,SP
00DE 6D 549 XRL A,R5
00DF 6006 550 JZ ?C0016
551 ; STACK[i] = STACK[SP];
552 ; i--;
553 ; SP--;
00E1 D0E0 554 POP ACC
00E3 F6 555 MOV @R0,A
00E4 18 556 DEC R0
557
00E5 80F5 558 SJMP ?C0015
00E7 559 ?C0016:
560 ; }
561 ; STKP[current] = i;
00E7 E50C 562 MOV A,?RTX_CURRENTTASK
00E9 2400 F 563 ADD A,#?RTX?TASKSP?S
00EB C8 564 XCH A,R0
00EC F6 565 MOV @R0,A
566 ; current--;
00ED 150C 567 DEC ?RTX_CURRENTTASK
00EF 80D3 568 SJMP ?C0011
00F1 569 ?C0012:
570 ; }
571
572 ; RoundRobinTime = ?RTX_TIMESHARING
573 IF (TIMESHARING)
00F1 750D05 574 MOV ?RTX_ROBINTIME,#TIMESHARING
575 ENDIF
576
577 ; if (STATE[current].st & K_ROBIN) goto RobinOn;
00F4 E50C 578 MOV A,?RTX_CURRENTTASK
00F6 23 579 RL A
00F7 2400 F 580 ADD A,#?RTX?TASKSTATE?S+1
00F9 F8 581 MOV R0,A
00FA 7F04 582 MOV R7,#SIG_EVENT
00FC C2AF 583 CLR EA
00FE E6 584 MOV A,@R0
585 IF (TIMESHARING)
00FF 10E61E 586 JBC ACC.B_ROBIN,RobinOn
587 ENDIF
588 ; if ((STATE[current].st & K_SIG) && (STATE[current].st & SIG_EVENT)
589 ; goto SignalOn;
0102 30E003 590 JNB ACC.B_WAITSIG,SignalOff
0105 10E20C 591 JBC ACC.B_SIGNAL,SignalOn
A51 MACRO ASSEMBLER CONF_TNY 12/27/2008 15:34:43 PAGE 10
0108 592 SignalOff:
593 ; if ((STATE[current].st & K_TMO) && (STATE[current].st & TMO_EVENT)
594 ; goto TimeOutOn;
0108 7F00 595 MOV R7,#0 ; No Event
010A 30E107 596 JNB ACC.B_WAITTIM,NoEvent
010D 30E304 597 JNB ACC.B_TIMEOUT,NoEvent
0110 598 TimeOutOn:
0110 7F08 599 MOV R7,#TMO_EVENT
0112 54F4 600 ANL A,#0F4H
0114 601 SignalOn:
0114 C2E7 602 NoEvent: CLR ACC.B_RDY ; Clear RDY bit
0116 C6 603 XCH A,@R0
0117 D2AF 604 SETB EA
605
0119 5480 606 ANL A,#K_RDY
011B 4207 607 ORL AR7,A
608 IF (TIMESHARING <> 0)
609 IF (CODE_BANKING)
POP ACC
CALL ?B_RESTORE_BANK
ENDIF
011D C200 F 613 CLR ?RTX_TS_DELAY
011F 22 614 RET
615 ELSE
IF (CODE_BANKING)
POP ACC
JMP ?B_RESTORE_BANK
ENDIF
RET
ENDIF
622
623
624
625 ;------------------------------------------------
626 IF (TIMESHARING <> 0)
0120 F6 627 RobinOn: MOV @R0,A
0121 D2AF 628 SETB EA
629 IF (CODE_BANKING)
POP ACC
CALL ?B_RESTORE_BANK
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -