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