📄 os_cpu_a.lst
字号:
0021 F6 487 MOV @R0,A
0022 08 488 INC R0
0023 09 489 INC R1
0024 DEFA 490 DJNZ R6,?C0002
0026 491 ?C0003:
492 ; temp = OSTsakStackBotton[OSTaskID+1] - (unsigned char idata *)SP-1;
0026 7400 F 493 MOV A,#LOW (OSTsakStackBotton+1)
A51 MACRO ASSEMBLER OS_CPU_A 12/21/2004 15:11:28 PAGE 9
0028 2500 F 494 ADD A,OSTaskID
002A F9 495 MOV R1,A
002B E7 496 MOV A,@R1
002C D3 497 SETB C
498 ;SUBB A,sp
002D 9A 499 SUBB A,r2
002E FF 500 MOV R7,A
501 ; SP = (unsigned char )cp1 - 1;
002F 18 502 DEC R0;
0030 8881 503 MOV SP,R0
504 ; for(i = OSTaskID+1;i < OSNextTaskID+1; i++)
505 ; {
506 ; OSTsakStackBotton[i] -= temp;
507 ; }
0032 E500 F 508 MOV A,OSNextTaskID
0034 C3 509 CLR C
0035 9500 F 510 SUBB A,OSTaskID
0037 FE 511 MOV R6,A
0038 600F 512 JZ ?C0005
513
003A 7400 F 514 MOV A,#LOW (OSTsakStackBotton)
003C 2500 F 515 ADD A,OSTaskID
003E F9 516 MOV R1,A
003F EF 517 MOV A,R7
0040 F4 518 CPL A
0041 04 519 INC A
0042 FF 520 MOV R7,A
0043 521 ?C0004:
0043 09 522 INC R1
0044 EF 523 MOV A,R7
0045 27 524 ADD A,@R1
0046 F7 525 MOV @R1,A
0047 DEFA 526 DJNZ R6,?C0004
0049 527 ?C0005:
528 ; OSTaskID = OSNextTaskID;
0049 850000 F 529 MOV OSTaskID,OSNextTaskID
530 ; LoadCtx();
004C 020000 F 531 LJMP LoadCtx
532 ; }
004F 533 ?C0001:
534 ;
535 ; if( OSNextTaskID != OSTaskID)
004F E500 F 536 MOV A,OSNextTaskID
0051 6500 F 537 XRL A,OSTaskID
0053 6036 538 JZ ?C000r
539 ; {
540 ; cp2--;
541 ; cp1--;
542 ; while(cp2 != (unsigned char idata *)temp)
543 ; {
544 ; *cp2-- = *cp1--;
545 ; }
546 ;MOV A,R7
547 ;CLR C
548 ;SUBB A,R1
549 ;MOV R6,A
0055 E8 550 mov a,r0
0056 C3 551 clr c
0057 9F 552 subb a,r7
0058 FE 553 mov r6,a
0059 554 ?C0008:
0059 18 555 DEC R0
005A 19 556 DEC R1
005B E6 557 MOV A,@R0
005C F7 558 MOV @R1,A
005D DEFA 559 DJNZ R6,?C0008
A51 MACRO ASSEMBLER OS_CPU_A 12/21/2004 15:11:28 PAGE 10
005F 560 ?C0009:
561 ; temp = OSTsakStackBotton[OSTaskID+1] - (unsigned char idata *)SP-1;
005F 7400 F 562 MOV A,#LOW (OSTsakStackBotton+01H)
0061 2500 F 563 ADD A,OSTaskID
0063 F9 564 MOV R1,A
0064 E7 565 MOV A,@R1
0065 D3 566 SETB C
567 ;SUBB A,SP
0066 9A 568 SUBB A,r2
0067 FF 569 MOV R7,A
570 ; SP = (unsigned char )OSTsakStackBotton[OSNextTaskID+1];
0068 7400 F 571 MOV A,#LOW (OSTsakStackBotton+01H)
006A 2500 F 572 ADD A,OSNextTaskID
006C F9 573 MOV R1,A
006D E7 574 MOV A,@R1
006E F581 575 MOV SP,A
576 ; for(i = OSNextTaskID+1;i < OSTaskID+1; i++)
577 ; {
578 ; OSTsakStackBotton[i] += temp;
579 ; }
580
0070 E500 F 581 MOV A,OSTaskID
0072 C3 582 CLR C
0073 9500 F 583 SUBB A,OSNextTaskID
0075 600C 584 JZ ?C0011
585
0077 FE 586 MOV R6,A
0078 7400 F 587 MOV A,#LOW (OSTsakStackBotton)
007A 2500 F 588 ADD A,OSNextTaskID
007C F9 589 MOV R1,A
007D 590 ?C0010:
007D 09 591 INC R1
007E EF 592 MOV A,R7
007F 27 593 ADD A,@R1
0080 F7 594 MOV @R1,A
0081 DEFA 595 DJNZ R6,?C0010
596
0083 597 ?C0011:
598 ; OSTaskID = OSNextTaskID;
0083 850000 F 599 MOV OSTaskID,OSNextTaskID
600 ; SP--;
0086 1581 601 DEC SP
602 ; }
0088 603 ?C0007:
604 ; LoadCtx();
0088 020000 F 605 LJMP LoadCtx
008B 606 ?C000r:
607 IF 0 <> 0
mov SP,r2
ENDIF
008B 020000 F 610 LJMP LoadCtx
611 ;****************************************************************************************
612 ;/*****************************************************************************************
****************
613 ;** 函数名称: OSIntCtxSw
614 ;** 功能描述: 中断使任务放弃CPU环境保存函数
615 ;** 输 入: OSTaskID
616 ;** 输 出 : 无
617 ;** 全局变量: OSFastSwap
618 ;** 调用模块: 无
619 ;**
620 ;** 作 者: 陈明计
621 ;** 日 期: 2002年2月22日
622 ;**----------------------------------------------------------------------------------------
---------------
623 ;** 修 改: 陈明计
A51 MACRO ASSEMBLER OS_CPU_A 12/21/2004 15:11:28 PAGE 11
624 ;** 日 期: 2002年12月2日
625 ;**----------------------------------------------------------------------------------------
---------------
626 ;** 修 改:
627 ;** 日 期:
628 ;**----------------------------------------------------------------------------------------
---------------
629 ;******************************************************************************************
**************/
---- 630 RSEG ?PR?OSIntCtxSw?OS_CPU_A
0000 631 OSIntCtxSw:
632 USING 0
633 ;是否是优先级最低任务
0000 7408 634 MOV A,#8
0002 6500 F 635 XRL A,OSTaskID
0004 700F 636 JNZ OSIntCtxSw_0
637 ;是则不需要保存所有寄存器
638 ;SP=SP-13-4 ;4:两层函数调用堆栈,13:寄存器数目
0006 74EF 639 MOV A,#(-17)
0008 2581 640 ADD A,SP
000A F581 641 MOV SP,A
642 ;跳转到OSCtxSw,同时通知CPU中断处理完成
000C 7400 F 643 MOV A, #LOW OSCtxSw
000E C0E0 644 PUSH ACC
0010 7400 F 645 MOV A, #HIGH OSCtxSw
0012 C0E0 646 PUSH ACC
0014 32 647 RETI
648 ;需要保存所有寄存器
0015 649 OSIntCtxSw_0:
650 ;SP=SP-4 ;4:两层函数调用堆栈
0015 74FC 651 MOV A,#0FCH
0017 2581 652 ADD A,SP
0019 F581 653 MOV SP,A
654 ;设置标志:任务再次恢复运行时需要恢复所有寄存器
001B 900000 F 655 MOV DPTR,#OSMapTbl
001E E500 F 656 MOV A,OSTaskID
657
0020 93 658 MOVC A,@A+DPTR
0021 F4 659 CPL A
0022 5500 F 660 ANL A,OSFastSwap
0024 F500 F 661 MOV OSFastSwap,A
679 ;跳转到堆栈处理,同时通知CPU中断处理完成
0026 7400 F 680 MOV A, #LOW C_OSCtxSw
0028 C0E0 681 PUSH ACC
002A 7400 F 682 MOV A, #HIGH C_OSCtxSw
002C C0E0 683 PUSH ACC
002E 32 684 RETI
685
686 ;****************************************************************************************
A51 MACRO ASSEMBLER OS_CPU_A 12/21/2004 15:11:28 PAGE 12
687 END
A51 MACRO ASSEMBLER OS_CPU_A 12/21/2004 15:11:28 PAGE 13
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES
?C0001. . . . . . . . . C ADDR 004FH R SEG=?PR?C_OSCTXSW?OS_CPU_C
?C0002. . . . . . . . . C ADDR 0020H R SEG=?PR?C_OSCTXSW?OS_CPU_C
?C0003. . . . . . . . . C ADDR 0026H R SEG=?PR?C_OSCTXSW?OS_CPU_C
?C0004. . . . . . . . . C ADDR 0043H R SEG=?PR?C_OSCTXSW?OS_CPU_C
?C0005. . . . . . . . . C ADDR 0049H R SEG=?PR?C_OSCTXSW?OS_CPU_C
?C0007. . . . . . . . . C ADDR 0088H R SEG=?PR?C_OSCTXSW?OS_CPU_C
?C0008. . . . . . . . . C ADDR 0059H R SEG=?PR?C_OSCTXSW?OS_CPU_C
?C0009. . . . . . . . . C ADDR 005FH R SEG=?PR?C_OSCTXSW?OS_CPU_C
?C000R. . . . . . . . . C ADDR 008BH R SEG=?PR?C_OSCTXSW?OS_CPU_C
?C0010. . . . . . . . . C ADDR 007DH R SEG=?PR?C_OSCTXSW?OS_CPU_C
?C0011. . . . . . . . . C ADDR 0083H R SEG=?PR?C_OSCTXSW?OS_CPU_C
?PR?C_OSCTXSW?OS_CPU_C. C SEG 008EH REL=UNIT
?PR?LOADCTX?OS_CPU_A. . C SEG 0033H REL=UNIT
?PR?OSCTXSW?OS_CPU_A. . C SEG 000DH REL=UNIT
?PR?OSINTCTXSW?OS_CPU_A C SEG 002FH REL=UNIT
?STACK. . . . . . . . . I SEG 0001H REL=UNIT
ACC . . . . . . . . . . D ADDR 00E0H A
B . . . . . . . . . . . D ADDR 00F0H A
C_OSCTXSW . . . . . . . C ADDR 0000H R SEG=?PR?C_OSCTXSW?OS_CPU_C
DPH . . . . . . . . . . D ADDR 0083H A
DPL . . . . . . . . . . D ADDR 0082H A
EA. . . . . . . . . . . B ADDR 00A8H.7 A
LOADCTX . . . . . . . . C ADDR 0000H R SEG=?PR?LOADCTX?OS_CPU_A
LOADCTX_0 . . . . . . . C ADDR 0009H R SEG=?PR?LOADCTX?OS_CPU_A
LOADCTX_2 . . . . . . . C ADDR 002BH R SEG=?PR?LOADCTX?OS_CPU_A
LOADCTX_3 . . . . . . . C ADDR 0032H R SEG=?PR?LOADCTX?OS_CPU_A
OSCTXSW . . . . . . . . C ADDR 0000H R SEG=?PR?OSCTXSW?OS_CPU_A
OSFASTSWAP. . . . . . . D ADDR ----- EXT
OSINTCTXSW. . . . . . . C ADDR 0000H R SEG=?PR?OSINTCTXSW?OS_CPU_A
OSINTCTXSW_0. . . . . . C ADDR 0015H R SEG=?PR?OSINTCTXSW?OS_CPU_A
OSMAPTBL. . . . . . . . C ADDR ----- EXT
OSNEXTTASKID. . . . . . D ADDR ----- EXT
OSTASKID. . . . . . . . D ADDR ----- EXT
OSTSAKSTACKBOTTON . . . D ADDR ----- EXT
OS_CPU_A_ASM. . . . . . N NUMB -----
OS_ENTER_SUM. . . . . . D ADDR ----- EXT
PSW . . . . . . . . . . D ADDR 00D0H A
SP. . . . . . . . . . . D ADDR 0081H A
STACK . . . . . . . . . I ADDR 0000H R SEG=?STACK
REGISTER BANK(S) USED: 0
ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -