📄 conf_tny.lst
字号:
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
004E 418 os_switch_task:
419
420 IF (CODE_BANKING <> 0)
004E C000 F 421 PUSH ?B_CURRENTBANK
422 ENDIF
423
0050 424 os_switch_task1:
425
426 ; next = current;
427 IF (TIMESHARING <> 0)
SETB ?RTX_TS_DELAY ; Delay Task Switching
ENDIF
0050 E50C 430 MOV A,?RTX_CURRENTTASK
0052 FF 431 MOV R7,A
432 ; while (1) {
0053 23 433 RL A
0054 2400 F 434 ADD A,#?RTX?TASKSTATE?S+1
0056 F8 435 MOV R0,A
0057 436 ?C0001:
437 ; if (++next == MAXTASKN+1) next = 0;
0057 0F 438 INC R7
0058 08 439 INC R0
0059 08 440 INC R0
441 IF (CPU_IDLE_CODE)
005A EF 442 MOV A,R7
005B B50C06 443 CJNE A,?RTX_CURRENTTASK,NoIDLE
005E 100003 F 444 JBC ?RTX_ISR_SIG,NoIDLE
445 CPU_IDLE ; CPU sleep
0064 447 NoIDLE:
448 ENDIF
0064 BF0004 F 449 CJNE R7,#?RTX_MAXTASKN+1,?C0003
0067 7F00 450 MOV R7,#0
0069 7800 F 451 MOV R0,#?RTX?TASKSTATE?S+1
006B 452 ?C0003:
453 ; if (STATE[next].st & K_READY) break;
006B E6 454 MOV A,@R0
006C 30E4E8 455 JNB ACC.B_READY,?C0001
456 ; }
457 ;
458
459 PUBLIC ?RTX_NEXTID
A51 MACRO ASSEMBLER CONF_TNY 03/23/2009 13:06:23 PAGE 8
460 PUBLIC ?RTX_NEXTTASK
461
0007 462 ?RTX_NEXTID EQU AR7
006F 00 463 ?RTX_NEXTTASK: NOP ; for Debugging
464
465 ; while (current < next) {
0070 466 ?C0005:
0070 E50C 467 MOV A,?RTX_CURRENTTASK
0072 C3 468 CLR C
0073 9F 469 SUBB A,R7
0074 5020 470 JNC ?C0011
471
472 ; current++;
0076 050C 473 INC ?RTX_CURRENTTASK
474 ; i = STKP[current];
0078 7400 F 475 MOV A,#?RTX?TASKSP?S
007A 250C 476 ADD A,?RTX_CURRENTTASK
007C F8 477 MOV R0,A
007D E6 478 MOV A,@R0
007E FD 479 MOV R5,A
480 ; STKP[current] = SP;
007F A681 481 MOV @R0,SP
482 ; if (current == MAXTASKN) limit = RAMTOP;
0081 08 483 INC R0
0082 E6 484 MOV A,@R0
0083 AE0C 485 MOV R6,?RTX_CURRENTTASK
0085 BE0002 F 486 CJNE R6,#?RTX_MAXTASKN,?C0007
0088 74FF 487 MOV A,#RAMTOP
008A 488 ?C0007:
008A CD 489 XCH A,R5
008B F8 490 MOV R0,A
491 ; else limit = STKP[current+1];
492 ;
493 ; while (i != limit) {
008C 494 ?C0009:
008C E8 495 MOV A,R0
008D 6D 496 XRL A,R5
008E 60E0 497 JZ ?C0005
498 ; SP++;
499 ; i++;
500 ; STACK[SP] = STACK[i];
0090 08 501 INC R0
0091 E6 502 MOV A,@R0
0092 C0E0 503 PUSH ACC
0094 80F6 504 SJMP ?C0009
505 ; }
506 ; }
0096 507 ?C0011:
508 ;
509 ; while (current > next) {
0096 E50C 510 MOV A,?RTX_CURRENTTASK
0098 D3 511 SETB C
0099 9F 512 SUBB A,R7
009A 4027 513 JC ?C0012
514
009C E50C 515 MOV A,?RTX_CURRENTTASK
009E 2400 F 516 ADD A,#?RTX?TASKSP?S+1
00A0 F8 517 MOV R0,A
00A1 E6 518 MOV A,@R0
519 ; if (current == (MAXTASKN)) i = RAMTOP;
520 ; else i = STKP[current+1];
00A2 AE0C 521 MOV R6,?RTX_CURRENTTASK
00A4 BE0002 F 522 CJNE R6,#?RTX_MAXTASKN,?C0013
00A7 74FF 523 MOV A,#RAMTOP
00A9 524 ?C0013:
00A9 FD 525 MOV R5,A
A51 MACRO ASSEMBLER CONF_TNY 03/23/2009 13:06:23 PAGE 9
526 ; limit = STKP[current];
00AA 18 527 DEC R0
00AB E6 528 MOV A,@R0
00AC CD 529 XCH A,R5
00AD F8 530 MOV R0,A
531 ;
532 ; while (SP != limit) {
00AE 533 ?C0015:
00AE E581 534 MOV A,SP
00B0 6D 535 XRL A,R5
00B1 6006 536 JZ ?C0016
537 ; STACK[i] = STACK[SP];
538 ; i--;
539 ; SP--;
00B3 D0E0 540 POP ACC
00B5 F6 541 MOV @R0,A
00B6 18 542 DEC R0
543
00B7 80F5 544 SJMP ?C0015
00B9 545 ?C0016:
546 ; }
547 ; STKP[current] = i;
00B9 E50C 548 MOV A,?RTX_CURRENTTASK
00BB 2400 F 549 ADD A,#?RTX?TASKSP?S
00BD C8 550 XCH A,R0
00BE F6 551 MOV @R0,A
552 ; current--;
00BF 150C 553 DEC ?RTX_CURRENTTASK
00C1 80D3 554 SJMP ?C0011
00C3 555 ?C0012:
556 ; }
557
558 ; RoundRobinTime = ?RTX_TIMESHARING
559 IF (TIMESHARING)
MOV ?RTX_ROBINTIME,#TIMESHARING
ENDIF
562
563 ; if (STATE[current].st & K_ROBIN) goto RobinOn;
00C3 E50C 564 MOV A,?RTX_CURRENTTASK
00C5 23 565 RL A
00C6 2400 F 566 ADD A,#?RTX?TASKSTATE?S+1
00C8 F8 567 MOV R0,A
00C9 7F04 568 MOV R7,#SIG_EVENT
00CB C2AF 569 CLR EA
00CD E6 570 MOV A,@R0
571 IF (TIMESHARING)
JBC ACC.B_ROBIN,RobinOn
ENDIF
574 ; if ((STATE[current].st & K_SIG) && (STATE[current].st & SIG_EVENT)
575 ; goto SignalOn;
00CE 30E003 576 JNB ACC.B_WAITSIG,SignalOff
00D1 10E20C 577 JBC ACC.B_SIGNAL,SignalOn
00D4 578 SignalOff:
579 ; if ((STATE[current].st & K_TMO) && (STATE[current].st & TMO_EVENT)
580 ; goto TimeOutOn;
00D4 7F00 581 MOV R7,#0 ; No Event
00D6 30E107 582 JNB ACC.B_WAITTIM,NoEvent
00D9 30E304 583 JNB ACC.B_TIMEOUT,NoEvent
00DC 584 TimeOutOn:
00DC 7F08 585 MOV R7,#TMO_EVENT
00DE 54F4 586 ANL A,#0F4H
00E0 587 SignalOn:
00E0 C2E7 588 NoEvent: CLR ACC.B_RDY ; Clear RDY bit
00E2 C6 589 XCH A,@R0
00E3 D2AF 590 SETB EA
591
A51 MACRO ASSEMBLER CONF_TNY 03/23/2009 13:06:23 PAGE 10
00E5 5480 592 ANL A,#K_RDY
00E7 4207 593 ORL AR7,A
594 IF (TIMESHARING <> 0)
IF (CODE_BANKING)
POP ACC
CALL ?B_RESTORE_BANK
ENDIF
CLR ?RTX_TS_DELAY
RET
ELSE
602 IF (CODE_BANKING)
00E9 D0E0 603 POP ACC
00EB 020000 F 604 JMP ?B_RESTORE_BANK
605 ENDIF
00EE 22 606 RET
607 ENDIF
608
609
610
611 ;------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -