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 + -
显示快捷键?