os_cpu_a.lst
来自「一个分选系统的软件:用SmallRtos操作系统」· LST 代码 · 共 797 行 · 第 1/3 页
LST
797 行
0022 08 483 INC R0
0023 09 484 INC R1
0024 DEFA 485 DJNZ R6,?C0002
0026 486 ?C0003:
487 ; temp = OSTsakStackBotton[OSTaskID+1] - (unsigned char idata *)SP-1;
0026 7400 F 488 MOV A,#LOW (OSTsakStackBotton+1)
0028 2500 F 489 ADD A,OSTaskID
002A F9 490 MOV R1,A
002B E7 491 MOV A,@R1
002C D3 492 SETB C
493 ;SUBB A,sp
A51 MACRO ASSEMBLER OS_CPU_A 06/20/2005 15:36:07 PAGE 9
002D 9A 494 SUBB A,r2
002E FF 495 MOV R7,A
496 ; SP = (unsigned char )cp1 - 1;
002F 18 497 DEC R0;
0030 8881 498 MOV SP,R0
499 ; for(i = OSTaskID+1;i < OSNextTaskID+1; i++)
500 ; {
501 ; OSTsakStackBotton[i] -= temp;
502 ; }
0032 E500 F 503 MOV A,OSNextTaskID
0034 C3 504 CLR C
0035 9500 F 505 SUBB A,OSTaskID
0037 FE 506 MOV R6,A
0038 600F 507 JZ ?C0005
508
003A 7400 F 509 MOV A,#LOW (OSTsakStackBotton)
003C 2500 F 510 ADD A,OSTaskID
003E F9 511 MOV R1,A
003F EF 512 MOV A,R7
0040 F4 513 CPL A
0041 04 514 INC A
0042 FF 515 MOV R7,A
0043 516 ?C0004:
0043 09 517 INC R1
0044 EF 518 MOV A,R7
0045 27 519 ADD A,@R1
0046 F7 520 MOV @R1,A
0047 DEFA 521 DJNZ R6,?C0004
0049 522 ?C0005:
523 ; OSTaskID = OSNextTaskID;
0049 850000 F 524 MOV OSTaskID,OSNextTaskID
525 ; LoadCtx();
004C 020000 F 526 LJMP LoadCtx
527 ; }
004F 528 ?C0001:
529 ;
530 ; if( OSNextTaskID != OSTaskID)
004F E500 F 531 MOV A,OSNextTaskID
0051 6500 F 532 XRL A,OSTaskID
0053 6036 533 JZ ?C000r
534 ; {
535 ; cp2--;
536 ; cp1--;
537 ; while(cp2 != (unsigned char idata *)temp)
538 ; {
539 ; *cp2-- = *cp1--;
540 ; }
541 ;MOV A,R7
542 ;CLR C
543 ;SUBB A,R1
544 ;MOV R6,A
0055 E8 545 mov a,r0
0056 C3 546 clr c
0057 9F 547 subb a,r7
0058 FE 548 mov r6,a
0059 549 ?C0008:
0059 18 550 DEC R0
005A 19 551 DEC R1
005B E6 552 MOV A,@R0
005C F7 553 MOV @R1,A
005D DEFA 554 DJNZ R6,?C0008
005F 555 ?C0009:
556 ; temp = OSTsakStackBotton[OSTaskID+1] - (unsigned char idata *)SP-1;
005F 7400 F 557 MOV A,#LOW (OSTsakStackBotton+01H)
0061 2500 F 558 ADD A,OSTaskID
0063 F9 559 MOV R1,A
A51 MACRO ASSEMBLER OS_CPU_A 06/20/2005 15:36:07 PAGE 10
0064 E7 560 MOV A,@R1
0065 D3 561 SETB C
562 ;SUBB A,SP
0066 9A 563 SUBB A,r2
0067 FF 564 MOV R7,A
565 ; SP = (unsigned char )OSTsakStackBotton[OSNextTaskID+1];
0068 7400 F 566 MOV A,#LOW (OSTsakStackBotton+01H)
006A 2500 F 567 ADD A,OSNextTaskID
006C F9 568 MOV R1,A
006D E7 569 MOV A,@R1
006E F581 570 MOV SP,A
571 ; for(i = OSNextTaskID+1;i < OSTaskID+1; i++)
572 ; {
573 ; OSTsakStackBotton[i] += temp;
574 ; }
575
0070 E500 F 576 MOV A,OSTaskID
0072 C3 577 CLR C
0073 9500 F 578 SUBB A,OSNextTaskID
0075 600C 579 JZ ?C0011
580
0077 FE 581 MOV R6,A
0078 7400 F 582 MOV A,#LOW (OSTsakStackBotton)
007A 2500 F 583 ADD A,OSNextTaskID
007C F9 584 MOV R1,A
007D 585 ?C0010:
007D 09 586 INC R1
007E EF 587 MOV A,R7
007F 27 588 ADD A,@R1
0080 F7 589 MOV @R1,A
0081 DEFA 590 DJNZ R6,?C0010
591
0083 592 ?C0011:
593 ; OSTaskID = OSNextTaskID;
0083 850000 F 594 MOV OSTaskID,OSNextTaskID
595 ; SP--;
0086 1581 596 DEC SP
597 ; }
0088 598 ?C0007:
599 ; LoadCtx();
0088 020000 F 600 LJMP LoadCtx
008B 601 ?C000r:
602 IF 0 <> 0
mov SP,r2
ENDIF
008B 020000 F 605 LJMP LoadCtx
606 ;****************************************************************************************
607 ;/*****************************************************************************************
****************
608 ;** 函数名称: OSIntCtxSw
609 ;** 功能描述: 中断使任务放弃CPU环境保存函数
610 ;** 输 入: OSTaskID
611 ;** 输 出 : 无
612 ;** 全局变量: OSFastSwap
613 ;** 调用模块: 无
614 ;**
615 ;** 作 者: 陈明计
616 ;** 日 期: 2002年2月22日
617 ;**----------------------------------------------------------------------------------------
---------------
618 ;** 修 改: 陈明计
619 ;** 日 期: 2002年12月2日
620 ;**----------------------------------------------------------------------------------------
---------------
621 ;** 修 改:
622 ;** 日 期:
A51 MACRO ASSEMBLER OS_CPU_A 06/20/2005 15:36:07 PAGE 11
623 ;**----------------------------------------------------------------------------------------
---------------
624 ;******************************************************************************************
**************/
---- 625 RSEG ?PR?OSIntCtxSw?OS_CPU_A
0000 626 OSIntCtxSw:
627 USING 0
628 ;是否是优先级最低任务
0000 7408 629 MOV A,#8
0002 6500 F 630 XRL A,OSTaskID
0004 700F 631 JNZ OSIntCtxSw_0
632 ;是则不需要保存所有寄存器
633 ;SP=SP-13-4 ;4:两层函数调用堆栈,13:寄存器数目
0006 74EF 634 MOV A,#(-17)
0008 2581 635 ADD A,SP
000A F581 636 MOV SP,A
637 ;跳转到OSCtxSw,同时通知CPU中断处理完成
000C 7400 F 638 MOV A, #LOW OSCtxSw
000E C0E0 639 PUSH ACC
0010 7400 F 640 MOV A, #HIGH OSCtxSw
0012 C0E0 641 PUSH ACC
0014 32 642 RETI
643 ;需要保存所有寄存器
0015 644 OSIntCtxSw_0:
645 ;SP=SP-4 ;4:两层函数调用堆栈
0015 74FC 646 MOV A,#0FCH
0017 2581 647 ADD A,SP
0019 F581 648 MOV SP,A
649 ;设置标志:任务再次恢复运行时需要恢复所有寄存器
001B 900000 F 650 MOV DPTR,#OSMapTbl
001E E500 F 651 MOV A,OSTaskID
652
0020 93 653 MOVC A,@A+DPTR
0021 F4 654 CPL A
0022 5500 F 655 ANL A,OSFastSwap
0024 F500 F 656 MOV OSFastSwap,A
674 ;跳转到堆栈处理,同时通知CPU中断处理完成
0026 7400 F 675 MOV A, #LOW C_OSCtxSw
0028 C0E0 676 PUSH ACC
002A 7400 F 677 MOV A, #HIGH C_OSCtxSw
002C C0E0 678 PUSH ACC
002E 32 679 RETI
680
681 ;****************************************************************************************
682 END
A51 MACRO ASSEMBLER OS_CPU_A 06/20/2005 15:36:07 PAGE 12
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 + =
减小字号Ctrl + -
显示快捷键?