📄 conf_tny.lst
字号:
404
405 ;------------------------------------------------
406 ; Perform a Task-Switch
407 ; void os_switch_task (void)
408 ; uchar i;
409 ; uchar limit;
410
411 ;---- Variable 'current' assigned to Register 'R6' ----
412 ;---- Variable 'next' assigned to Register 'R7' ----
413 ;---- Variable 'i' assigned to Register 'R0' ----
414 ;---- Variable 'limit' assigned to Register 'R5' ----
415 ;
416 ;------------------------------------------------
417
004D 418 os_switch_task:
419
420 IF (CODE_BANKING <> 0)
PUSH ?B_CURRENTBANK
ENDIF
423
004D 424 os_switch_task1:
425
426 ; next = current;
427 IF (TIMESHARING <> 0)
SETB ?RTX_TS_DELAY ; Delay Task Switching
ENDIF
004D E50C 430 MOV A,?RTX_CURRENTTASK
004F FF 431 MOV R7,A
432 ; while (1) {
0050 23 433 RL A
0051 2400 F 434 ADD A,#?RTX?TASKSTATE?S+1
0053 F8 435 MOV R0,A
0054 436 ?C0001:
437 ; if (++next == MAXTASKN+1) next = 0;
0054 0F 438 INC R7
0055 08 439 INC R0
0056 08 440 INC R0
441 IF (CPU_IDLE_CODE)
MOV A,R7
CJNE A,?RTX_CURRENTTASK,NoIDLE
JBC ?RTX_ISR_SIG,NoIDLE
CPU_IDLE ; CPU sleep
NoIDLE:
ENDIF
0057 BF0004 F 448 CJNE R7,#?RTX_MAXTASKN+1,?C0003
005A 7F00 449 MOV R7,#0
005C 7800 F 450 MOV R0,#?RTX?TASKSTATE?S+1
005E 451 ?C0003:
452 ; if (STATE[next].st & K_READY) break;
005E E6 453 MOV A,@R0
005F 30E4F2 454 JNB ACC.B_READY,?C0001
455 ; }
456 ;
457
458 PUBLIC ?RTX_NEXTID
A51 MACRO ASSEMBLER CONF_TNY 01/29/2007 19:51:11 PAGE 8
459 PUBLIC ?RTX_NEXTTASK
460
0007 461 ?RTX_NEXTID EQU AR7
0062 00 462 ?RTX_NEXTTASK: NOP ; for Debugging
463
464 ; while (current < next) {
0063 465 ?C0005:
0063 E50C 466 MOV A,?RTX_CURRENTTASK
0065 C3 467 CLR C
0066 9F 468 SUBB A,R7
0067 5020 469 JNC ?C0011
470
471 ; current++;
0069 050C 472 INC ?RTX_CURRENTTASK
473 ; i = STKP[current];
006B 7400 F 474 MOV A,#?RTX?TASKSP?S
006D 250C 475 ADD A,?RTX_CURRENTTASK
006F F8 476 MOV R0,A
0070 E6 477 MOV A,@R0
0071 FD 478 MOV R5,A
479 ; STKP[current] = SP;
0072 A681 480 MOV @R0,SP
481 ; if (current == MAXTASKN) limit = RAMTOP;
0074 08 482 INC R0
0075 E6 483 MOV A,@R0
0076 AE0C 484 MOV R6,?RTX_CURRENTTASK
0078 BE0002 F 485 CJNE R6,#?RTX_MAXTASKN,?C0007
007B 747F 486 MOV A,#RAMTOP
007D 487 ?C0007:
007D CD 488 XCH A,R5
007E F8 489 MOV R0,A
490 ; else limit = STKP[current+1];
491 ;
492 ; while (i != limit) {
007F 493 ?C0009:
007F E8 494 MOV A,R0
0080 6D 495 XRL A,R5
0081 60E0 496 JZ ?C0005
497 ; SP++;
498 ; i++;
499 ; STACK[SP] = STACK[i];
0083 08 500 INC R0
0084 E6 501 MOV A,@R0
0085 C0E0 502 PUSH ACC
0087 80F6 503 SJMP ?C0009
504 ; }
505 ; }
0089 506 ?C0011:
507 ;
508 ; while (current > next) {
0089 E50C 509 MOV A,?RTX_CURRENTTASK
008B D3 510 SETB C
008C 9F 511 SUBB A,R7
008D 4027 512 JC ?C0012
513
008F E50C 514 MOV A,?RTX_CURRENTTASK
0091 2400 F 515 ADD A,#?RTX?TASKSP?S+1
0093 F8 516 MOV R0,A
0094 E6 517 MOV A,@R0
518 ; if (current == (MAXTASKN)) i = RAMTOP;
519 ; else i = STKP[current+1];
0095 AE0C 520 MOV R6,?RTX_CURRENTTASK
0097 BE0002 F 521 CJNE R6,#?RTX_MAXTASKN,?C0013
009A 747F 522 MOV A,#RAMTOP
009C 523 ?C0013:
009C FD 524 MOV R5,A
A51 MACRO ASSEMBLER CONF_TNY 01/29/2007 19:51:11 PAGE 9
525 ; limit = STKP[current];
009D 18 526 DEC R0
009E E6 527 MOV A,@R0
009F CD 528 XCH A,R5
00A0 F8 529 MOV R0,A
530 ;
531 ; while (SP != limit) {
00A1 532 ?C0015:
00A1 E581 533 MOV A,SP
00A3 6D 534 XRL A,R5
00A4 6006 535 JZ ?C0016
536 ; STACK[i] = STACK[SP];
537 ; i--;
538 ; SP--;
00A6 D0E0 539 POP ACC
00A8 F6 540 MOV @R0,A
00A9 18 541 DEC R0
542
00AA 80F5 543 SJMP ?C0015
00AC 544 ?C0016:
545 ; }
546 ; STKP[current] = i;
00AC E50C 547 MOV A,?RTX_CURRENTTASK
00AE 2400 F 548 ADD A,#?RTX?TASKSP?S
00B0 C8 549 XCH A,R0
00B1 F6 550 MOV @R0,A
551 ; current--;
00B2 150C 552 DEC ?RTX_CURRENTTASK
00B4 80D3 553 SJMP ?C0011
00B6 554 ?C0012:
555 ; }
556
557 ; RoundRobinTime = ?RTX_TIMESHARING
558 IF (TIMESHARING)
MOV ?RTX_ROBINTIME,#TIMESHARING
ENDIF
561
562 ; if (STATE[current].st & K_ROBIN) goto RobinOn;
00B6 E50C 563 MOV A,?RTX_CURRENTTASK
00B8 23 564 RL A
00B9 2400 F 565 ADD A,#?RTX?TASKSTATE?S+1
00BB F8 566 MOV R0,A
00BC 7F04 567 MOV R7,#SIG_EVENT
00BE C2AF 568 CLR EA
00C0 E6 569 MOV A,@R0
570 IF (TIMESHARING)
JBC ACC.B_ROBIN,RobinOn
ENDIF
573 ; if ((STATE[current].st & K_SIG) && (STATE[current].st & SIG_EVENT)
574 ; goto SignalOn;
00C1 30E003 575 JNB ACC.B_WAITSIG,SignalOff
00C4 10E20C 576 JBC ACC.B_SIGNAL,SignalOn
00C7 577 SignalOff:
578 ; if ((STATE[current].st & K_TMO) && (STATE[current].st & TMO_EVENT)
579 ; goto TimeOutOn;
00C7 7F00 580 MOV R7,#0 ; No Event
00C9 30E107 581 JNB ACC.B_WAITTIM,NoEvent
00CC 30E304 582 JNB ACC.B_TIMEOUT,NoEvent
00CF 583 TimeOutOn:
00CF 7F08 584 MOV R7,#TMO_EVENT
00D1 54F4 585 ANL A,#0F4H
00D3 586 SignalOn:
00D3 547C 587 NoEvent: ANL A,#NOT (K_RDY + K_TMO + K_SIG) ; Clear RDY + Wait bits
00D5 C6 588 XCH A,@R0
00D6 D2AF 589 SETB EA
590
A51 MACRO ASSEMBLER CONF_TNY 01/29/2007 19:51:11 PAGE 10
00D8 5480 591 ANL A,#K_RDY
00DA 4207 592 ORL AR7,A
593 IF (TIMESHARING <> 0)
IF (CODE_BANKING)
POP ACC
CALL ?B_RESTORE_BANK
ENDIF
CLR ?RTX_TS_DELAY
RET
ELSE
601 IF (CODE_BANKING)
POP ACC
JMP ?B_RESTORE_BANK
ENDIF
00DC 22 605 RET
606 ENDIF
607
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -