📄 conf_tny.lst
字号:
ENDIF
407
408 ;------------------------------------------------
409 ; Perform a Task-Switch
410 ; void os_switch_task (void)
411 ; uchar i;
412 ; uchar limit;
413
414 ;---- Variable 'current' assigned to Register 'R6' ----
415 ;---- Variable 'next' assigned to Register 'R7' ----
416 ;---- Variable 'i' assigned to Register 'R0' ----
417 ;---- Variable 'limit' assigned to Register 'R5' ----
418 ;
419 ;------------------------------------------------
420
004C 421 os_switch_task:
422
423 IF (CODE_BANKING <> 0)
PUSH ?B_CURRENTBANK
ENDIF
426
004C 427 os_switch_task1:
428
429 ; next = current;
430 IF (TIMESHARING <> 0)
SETB ?RTX_TS_DELAY ; Delay Task Switching
ENDIF
004C E50C 433 MOV A,?RTX_CURRENTTASK
004E FF 434 MOV R7,A
435 ; while (1) {
004F 23 436 RL A
0050 2400 F 437 ADD A,#?RTX?TASKSTATE?S+1
0052 F8 438 MOV R0,A
0053 439 ?C0001:
440 ; if (++next == MAXTASKN+1) next = 0;
0053 0F 441 INC R7
0054 08 442 INC R0
0055 08 443 INC R0
444 IF (CPU_IDLE_CODE)
MOV A,R7
CJNE A,?RTX_CURRENTTASK,NoIDLE
JBC ?RTX_ISR_SIG,NoIDLE
CPU_IDLE ; CPU sleep
NoIDLE:
ENDIF
0056 BF0004 F 451 CJNE R7,#?RTX_MAXTASKN+1,?C0003
0059 7F00 452 MOV R7,#0
005B 7800 F 453 MOV R0,#?RTX?TASKSTATE?S+1
005D 454 ?C0003:
455 ; if (STATE[next].st & K_READY) break;
005D E6 456 MOV A,@R0
005E 30E4F2 457 JNB ACC.B_READY,?C0001
458 ; }
A51 MACRO ASSEMBLER CONF_TNY 12/09/2008 16:32:51 PAGE 8
459 ;
460
461 PUBLIC ?RTX_NEXTID
462 PUBLIC ?RTX_NEXTTASK
463
0007 464 ?RTX_NEXTID EQU AR7
0061 00 465 ?RTX_NEXTTASK: NOP ; for Debugging
466
467 ; while (current < next) {
0062 468 ?C0005:
0062 E50C 469 MOV A,?RTX_CURRENTTASK
0064 C3 470 CLR C
0065 9F 471 SUBB A,R7
0066 5020 472 JNC ?C0011
473
474 ; current++;
0068 050C 475 INC ?RTX_CURRENTTASK
476 ; i = STKP[current];
006A 7400 F 477 MOV A,#?RTX?TASKSP?S
006C 250C 478 ADD A,?RTX_CURRENTTASK
006E F8 479 MOV R0,A
006F E6 480 MOV A,@R0
0070 FD 481 MOV R5,A
482 ; STKP[current] = SP;
0071 A681 483 MOV @R0,SP
484 ; if (current == MAXTASKN) limit = RAMTOP;
0073 08 485 INC R0
0074 E6 486 MOV A,@R0
0075 AE0C 487 MOV R6,?RTX_CURRENTTASK
0077 BE0002 F 488 CJNE R6,#?RTX_MAXTASKN,?C0007
007A 74FF 489 MOV A,#RAMTOP
007C 490 ?C0007:
007C CD 491 XCH A,R5
007D F8 492 MOV R0,A
493 ; else limit = STKP[current+1];
494 ;
495 ; while (i != limit) {
007E 496 ?C0009:
007E E8 497 MOV A,R0
007F 6D 498 XRL A,R5
0080 60E0 499 JZ ?C0005
500 ; SP++;
501 ; i++;
502 ; STACK[SP] = STACK[i];
0082 08 503 INC R0
0083 E6 504 MOV A,@R0
0084 C0E0 505 PUSH ACC
0086 80F6 506 SJMP ?C0009
507 ; }
508 ; }
0088 509 ?C0011:
510 ;
511 ; while (current > next) {
0088 E50C 512 MOV A,?RTX_CURRENTTASK
008A D3 513 SETB C
008B 9F 514 SUBB A,R7
008C 4027 515 JC ?C0012
516
008E E50C 517 MOV A,?RTX_CURRENTTASK
0090 2400 F 518 ADD A,#?RTX?TASKSP?S+1
0092 F8 519 MOV R0,A
0093 E6 520 MOV A,@R0
521 ; if (current == (MAXTASKN)) i = RAMTOP;
522 ; else i = STKP[current+1];
0094 AE0C 523 MOV R6,?RTX_CURRENTTASK
0096 BE0002 F 524 CJNE R6,#?RTX_MAXTASKN,?C0013
A51 MACRO ASSEMBLER CONF_TNY 12/09/2008 16:32:51 PAGE 9
0099 74FF 525 MOV A,#RAMTOP
009B 526 ?C0013:
009B FD 527 MOV R5,A
528 ; limit = STKP[current];
009C 18 529 DEC R0
009D E6 530 MOV A,@R0
009E CD 531 XCH A,R5
009F F8 532 MOV R0,A
533 ;
534 ; while (SP != limit) {
00A0 535 ?C0015:
00A0 E581 536 MOV A,SP
00A2 6D 537 XRL A,R5
00A3 6006 538 JZ ?C0016
539 ; STACK[i] = STACK[SP];
540 ; i--;
541 ; SP--;
00A5 D0E0 542 POP ACC
00A7 F6 543 MOV @R0,A
00A8 18 544 DEC R0
545
00A9 80F5 546 SJMP ?C0015
00AB 547 ?C0016:
548 ; }
549 ; STKP[current] = i;
00AB E50C 550 MOV A,?RTX_CURRENTTASK
00AD 2400 F 551 ADD A,#?RTX?TASKSP?S
00AF C8 552 XCH A,R0
00B0 F6 553 MOV @R0,A
554 ; current--;
00B1 150C 555 DEC ?RTX_CURRENTTASK
00B3 80D3 556 SJMP ?C0011
00B5 557 ?C0012:
558 ; }
559
560 ; RoundRobinTime = ?RTX_TIMESHARING
561 IF (TIMESHARING)
MOV ?RTX_ROBINTIME,#TIMESHARING
ENDIF
564
565 ; if (STATE[current].st & K_ROBIN) goto RobinOn;
00B5 E50C 566 MOV A,?RTX_CURRENTTASK
00B7 23 567 RL A
00B8 2400 F 568 ADD A,#?RTX?TASKSTATE?S+1
00BA F8 569 MOV R0,A
00BB 7F04 570 MOV R7,#SIG_EVENT
00BD C2AF 571 CLR EA
00BF E6 572 MOV A,@R0
573 IF (TIMESHARING)
JBC ACC.B_ROBIN,RobinOn
ENDIF
576 ; if ((STATE[current].st & K_SIG) && (STATE[current].st & SIG_EVENT)
577 ; goto SignalOn;
00C0 30E003 578 JNB ACC.B_WAITSIG,SignalOff
00C3 10E20C 579 JBC ACC.B_SIGNAL,SignalOn
00C6 580 SignalOff:
581 ; if ((STATE[current].st & K_TMO) && (STATE[current].st & TMO_EVENT)
582 ; goto TimeOutOn;
00C6 7F00 583 MOV R7,#0 ; No Event
00C8 30E107 584 JNB ACC.B_WAITTIM,NoEvent
00CB 30E304 585 JNB ACC.B_TIMEOUT,NoEvent
00CE 586 TimeOutOn:
00CE 7F08 587 MOV R7,#TMO_EVENT
00D0 54F4 588 ANL A,#0F4H
00D2 589 SignalOn:
00D2 C2E7 590 NoEvent: CLR ACC.B_RDY ; Clear RDY bit
A51 MACRO ASSEMBLER CONF_TNY 12/09/2008 16:32:51 PAGE 10
00D4 C6 591 XCH A,@R0
00D5 D2AF 592 SETB EA
593
00D7 5480 594 ANL A,#K_RDY
00D9 4207 595 ORL AR7,A
596 IF (TIMESHARING <> 0)
IF (CODE_BANKING)
POP ACC
CALL ?B_RESTORE_BANK
ENDIF
CLR ?RTX_TS_DELAY
RET
ELSE
604 IF (CODE_BANKING)
POP ACC
JMP ?B_RESTORE_BANK
ENDIF
00DB 22 608 RET
609 ENDIF
610
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -