?? 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)
PUSH ?B_CURRENTBANK
ENDIF
423
004E 424 os_switch_task1:
425
426 ; next = current;
427 IF (TIMESHARING <> 0)
SETB ?RTX_TS_DELAY ; Delay Task Switching
ENDIF
004E E50C 430 MOV A,?RTX_CURRENTTASK
0050 FF 431 MOV R7,A
432 ; while (1) {
0051 23 433 RL A
0052 2400 F 434 ADD A,#?RTX?TASKSTATE?S+1
0054 F8 435 MOV R0,A
0055 436 ?C0001:
437 ; if (++next == MAXTASKN+1) next = 0;
0055 0F 438 INC R7
0056 08 439 INC R0
0057 08 440 INC R0
441 IF (CPU_IDLE_CODE)
0058 EF 442 MOV A,R7
0059 B50C06 443 CJNE A,?RTX_CURRENTTASK,NoIDLE
005C 100003 F 444 JBC ?RTX_ISR_SIG,NoIDLE
445 CPU_IDLE ; CPU sleep
0062 447 NoIDLE:
448 ENDIF
0062 BF0004 F 449 CJNE R7,#?RTX_MAXTASKN+1,?C0003
0065 7F00 450 MOV R7,#0
0067 7800 F 451 MOV R0,#?RTX?TASKSTATE?S+1
0069 452 ?C0003:
453 ; if (STATE[next].st & K_READY) break;
0069 E6 454 MOV A,@R0
006A 30E4E8 455 JNB ACC.B_READY,?C0001
456 ; }
457 ;
458
459 PUBLIC ?RTX_NEXTID
A51 MACRO ASSEMBLER CONF_TNY 07/24/2006 09:15:26 PAGE 8
460 PUBLIC ?RTX_NEXTTASK
461
0007 462 ?RTX_NEXTID EQU AR7
006D 00 463 ?RTX_NEXTTASK: NOP ; for Debugging
464
465 ; while (current < next) {
006E 466 ?C0005:
006E E50C 467 MOV A,?RTX_CURRENTTASK
0070 C3 468 CLR C
0071 9F 469 SUBB A,R7
0072 5020 470 JNC ?C0011
471
472 ; current++;
0074 050C 473 INC ?RTX_CURRENTTASK
474 ; i = STKP[current];
0076 7400 F 475 MOV A,#?RTX?TASKSP?S
0078 250C 476 ADD A,?RTX_CURRENTTASK
007A F8 477 MOV R0,A
007B E6 478 MOV A,@R0
007C FD 479 MOV R5,A
480 ; STKP[current] = SP;
007D A681 481 MOV @R0,SP
482 ; if (current == MAXTASKN) limit = RAMTOP;
007F 08 483 INC R0
0080 E6 484 MOV A,@R0
0081 AE0C 485 MOV R6,?RTX_CURRENTTASK
0083 BE0002 F 486 CJNE R6,#?RTX_MAXTASKN,?C0007
0086 74FF 487 MOV A,#RAMTOP
0088 488 ?C0007:
0088 CD 489 XCH A,R5
0089 F8 490 MOV R0,A
491 ; else limit = STKP[current+1];
492 ;
493 ; while (i != limit) {
008A 494 ?C0009:
008A E8 495 MOV A,R0
008B 6D 496 XRL A,R5
008C 60E0 497 JZ ?C0005
498 ; SP++;
499 ; i++;
500 ; STACK[SP] = STACK[i];
008E 08 501 INC R0
008F E6 502 MOV A,@R0
0090 C0E0 503 PUSH ACC
0092 80F6 504 SJMP ?C0009
505 ; }
506 ; }
0094 507 ?C0011:
508 ;
509 ; while (current > next) {
0094 E50C 510 MOV A,?RTX_CURRENTTASK
0096 D3 511 SETB C
0097 9F 512 SUBB A,R7
0098 4027 513 JC ?C0012
514
009A E50C 515 MOV A,?RTX_CURRENTTASK
009C 2400 F 516 ADD A,#?RTX?TASKSP?S+1
009E F8 517 MOV R0,A
009F E6 518 MOV A,@R0
519 ; if (current == (MAXTASKN)) i = RAMTOP;
520 ; else i = STKP[current+1];
00A0 AE0C 521 MOV R6,?RTX_CURRENTTASK
00A2 BE0002 F 522 CJNE R6,#?RTX_MAXTASKN,?C0013
00A5 74FF 523 MOV A,#RAMTOP
00A7 524 ?C0013:
00A7 FD 525 MOV R5,A
A51 MACRO ASSEMBLER CONF_TNY 07/24/2006 09:15:26 PAGE 9
526 ; limit = STKP[current];
00A8 18 527 DEC R0
00A9 E6 528 MOV A,@R0
00AA CD 529 XCH A,R5
00AB F8 530 MOV R0,A
531 ;
532 ; while (SP != limit) {
00AC 533 ?C0015:
00AC E581 534 MOV A,SP
00AE 6D 535 XRL A,R5
00AF 6006 536 JZ ?C0016
537 ; STACK[i] = STACK[SP];
538 ; i--;
539 ; SP--;
00B1 D0E0 540 POP ACC
00B3 F6 541 MOV @R0,A
00B4 18 542 DEC R0
543
00B5 80F5 544 SJMP ?C0015
00B7 545 ?C0016:
546 ; }
547 ; STKP[current] = i;
00B7 E50C 548 MOV A,?RTX_CURRENTTASK
00B9 2400 F 549 ADD A,#?RTX?TASKSP?S
00BB C8 550 XCH A,R0
00BC F6 551 MOV @R0,A
552 ; current--;
00BD 150C 553 DEC ?RTX_CURRENTTASK
00BF 80D3 554 SJMP ?C0011
00C1 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;
00C1 E50C 564 MOV A,?RTX_CURRENTTASK
00C3 23 565 RL A
00C4 2400 F 566 ADD A,#?RTX?TASKSTATE?S+1
00C6 F8 567 MOV R0,A
00C7 7F04 568 MOV R7,#SIG_EVENT
00C9 C2AF 569 CLR EA
00CB 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;
00CC 30E003 576 JNB ACC.B_WAITSIG,SignalOff
00CF 10E20C 577 JBC ACC.B_SIGNAL,SignalOn
00D2 578 SignalOff:
579 ; if ((STATE[current].st & K_TMO) && (STATE[current].st & TMO_EVENT)
580 ; goto TimeOutOn;
00D2 7F00 581 MOV R7,#0 ; No Event
00D4 30E107 582 JNB ACC.B_WAITTIM,NoEvent
00D7 30E304 583 JNB ACC.B_TIMEOUT,NoEvent
00DA 584 TimeOutOn:
00DA 7F08 585 MOV R7,#TMO_EVENT
00DC 54F4 586 ANL A,#0F4H
00DE 587 SignalOn:
00DE C2E7 588 NoEvent: CLR ACC.B_RDY ; Clear RDY bit
00E0 C6 589 XCH A,@R0
00E1 D2AF 590 SETB EA
591
A51 MACRO ASSEMBLER CONF_TNY 07/24/2006 09:15:26 PAGE 10
00E3 5480 592 ANL A,#K_RDY
00E5 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)
POP ACC
JMP ?B_RESTORE_BANK
ENDIF
00E7 22 606 RET
607 ENDIF
608
609
610
611 ;------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -