os_cpu_a.lst

来自「一个分选系统的软件:用SmallRtos操作系统」· LST 代码 · 共 797 行 · 第 1/3 页

LST
797
字号
                +1   239     
                +1   240     
                +1   241     
                +1   242     
                +1   243     
A51 MACRO ASSEMBLER  OS_CPU_A                                                             06/20/2005 15:36:07 PAGE     5

                +1   244     
                +1   245     
                +1   246     
                +1   247     
                +1   248                                                 
                +1   249     
                +1   250     
                +1   251     
                +1   252     
                +1   253     
                +1   254     
                +1   255     
                +1   256     
                +1   257     
                +1   258     
                +1   259     
                +1   260     
                +1   261     
                +1   262     
                +1           
                +1           
                +1   265     
                +1           
                +1           
                +1           
                +1           
                +1           
                +1   271     
                +1   272     
                +1   273     
                     274     
                     275     
                     276             NAME    OS_CPU_A_ASM
                     277     
                     278     ?PR?OSCtxSw?OS_CPU_A                     SEGMENT CODE ;INBLOCK 
                     279     ?PR?OSIntCtxSw?OS_CPU_A                  SEGMENT CODE ;INBLOCK 
                     280     ?PR?LoadCtx?OS_CPU_A                     SEGMENT CODE ;INBLOCK 
                     281     ?PR?C_OSCtxSw?OS_CPU_C                   SEGMENT CODE 
                     282     
                     283     
                     284             EXTRN   CODE (OSMapTbl)
                     285             EXTRN   DATA (OSFastSwap)
                     286             EXTRN   DATA (OSTaskID)
                     287             EXTRN   DATA (OSNextTaskID)
                     288             EXTRN   DATA (OSTsakStackBotton)
                     289             EXTRN   DATA (Os_Enter_Sum)
                     290     IF 0  <> 0
                                     EXTRN   IDATA (Sp2)
                             ENDIF
                     293     
                     294     
                     295             PUBLIC  LoadCtx
                     296             PUBLIC  OSIntCtxSw
                     297             PUBLIC  OSCtxSw
                     298             PUBLIC  STACK 
                     299     
                     300     ;****************************************************************************************
                     301     ;?STACK SEGMENT IDATA
                     302     
                     303     ?STACK          SEGMENT   IDATA
                     304     
----                 305                     RSEG    ?STACK
0000                 306     STACK:                                          ;堆栈
0000                 307                     DS      1
                     308     
                     309     ;****************************************************************************************
A51 MACRO ASSEMBLER  OS_CPU_A                                                             06/20/2005 15:36:07 PAGE     6

                     310     ;/*****************************************************************************************
                             ****************
                     311     ;** 函数名称: LoadCtx
                     312     ;** 功能描述: 任务环境恢复函数
                     313     ;** 输 入: OSTaskID,OSFastSwap
                     314     ;** 输 出 : 无
                     315     ;** 全局变量: 无
                     316     ;** 调用模块: 无
                     317     ;** 
                     318     ;** 作 者: 陈明计
                     319     ;** 日 期: 2002年2月22日
                     320     ;**----------------------------------------------------------------------------------------
                             ---------------
                     321     ;** 修 改: 陈明计
                     322     ;** 日 期: 2002年12月2日
                     323     ;**----------------------------------------------------------------------------------------
                             ---------------
                     324     ;** 修 改: 陈明计
                     325     ;** 日 期: 2003年2月5日
                     326     ;**----------------------------------------------------------------------------------------
                             ---------------
                     327     ;** 修 改:
                     328     ;** 日 期:
                     329     ;**----------------------------------------------------------------------------------------
                             ---------------
                     330     ;******************************************************************************************
                             **************/
                     331     
----                 332             RSEG  ?PR?LoadCtx?OS_CPU_A
0000                 333     LoadCtx:
                     334             USING   0
                     335                
0000 D000     F      336         POP     Os_Enter_Sum            ;恢复关中断计数器
                     337                                         ;判断是否需要恢复所有寄存器
0002 E500     F      338         MOV     A,OSTaskID
0004 B40802          339         CJNE    A,#8,LoadCtx_0
0007 8022            340         SJMP    LoadCtx_2
0009                 341     LoadCtx_0:
0009 900000   F      342         MOV     DPTR,#OSMapTbl
                     343     
000C 93              344         MOVC    A,@A+DPTR
000D 5500     F      345         ANL     A,OSFastSwap
                             
                                 
                                 
                                 
                                 
                                 
                                 
                             
                                 
                                 
                             
000F 701A            357         JNZ     LoadCtx_2
                     358                                         ;恢复寄存器
0011 D007            359         POP     7
0013 D006            360         POP     6
0015 D005            361         POP     5
0017 D004            362         POP     4
0019 D003            363         POP     3
001B D002            364         POP     2
001D D001            365         POP     1
001F D000            366         POP     0
0021 D0D0            367         POP     PSW
0023 D082            368         POP     DPL
0025 D083            369         POP     DPH
A51 MACRO ASSEMBLER  OS_CPU_A                                                             06/20/2005 15:36:07 PAGE     7

0027 D0F0            370         POP     B
0029 D0E0            371         POP     ACC
002B                 372     LoadCtx_2:
                     373                                         ;判断是否需要开中断
002B 0500     F      374         INC     Os_Enter_Sum
002D D50002   F      375         djnz    Os_Enter_Sum,LoadCtx_3
                     376         SET_EA                          ;开中断
0032                 378     LoadCtx_3:
0032 22              379         RET
                     380     
                     381     ;****************************************************************************************
                     382     ;/*****************************************************************************************
                             ****************
                     383     ;** 函数名称: OSCtxSw
                     384     ;** 功能描述: 任务主动放弃CPU环境保存函数
                     385     ;** 输 入: OSTaskID
                     386     ;** 输 出 : 无
                     387     ;** 全局变量: OSFastSwap
                     388     ;** 调用模块: 无
                     389     ;** 
                     390     ;** 作 者: 陈明计
                     391     ;** 日 期: 2002年2月22日
                     392     ;**----------------------------------------------------------------------------------------
                             ---------------
                     393     ;** 修 改:
                     394     ;** 日 期:
                     395     ;**----------------------------------------------------------------------------------------
                             ---------------
                     396     ;******************************************************************************************
                             **************/
----                 397         RSEG  ?PR?OSCtxSw?OS_CPU_A
0000                 398     OSCtxSw:
                     399         USING       0
                     400                                         ;设置标志:任务再次恢复运行时不必恢复所有寄存器
0000 900000   F      401         MOV     DPTR,#OSMapTbl
0003 E500     F      402         MOV     A,OSTaskID
                     403     
0005 93              404         MOVC    A,@A+DPTR
0006 4500     F      405         ORL     A,OSFastSwap
0008 F500     F      406         MOV     OSFastSwap,A
                             
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                             
                                 
                                 
                                 
                                 
                             
000A 020000   F      421         LJMP    C_OSCtxSw
                     422     ;****************************************************************************************
                     423     ;/*****************************************************************************************
                             ****************
                     424     ;** 函数名称: C_OSCtxSw
                     425     ;** 功能描述: 堆栈处理函数
                     426     ;** 输 入: 无
                     427     ;** 输 出 : 无
                     428     ;** 全局变量: OSTaskID,OSTsakStackBotton,SP
                     429     ;** 调用模块: LoadCtx
                     430     ;** 
                     431     ;** 作 者: 陈明计
A51 MACRO ASSEMBLER  OS_CPU_A                                                             06/20/2005 15:36:07 PAGE     8

                     432     ;** 日 期: 2002年2月22日
                     433     ;**----------------------------------------------------------------------------------------
                             ---------------
                     434     ;** 修 改: 陈明计
                     435     ;** 日 期: 2002年12月2日
                     436     ;**----------------------------------------------------------------------------------------
                             ---------------
                     437     ;** 修 改:
                     438     ;** 日 期:
                     439     ;**----------------------------------------------------------------------------------------
                             ---------------
                     440     ;******************************************************************************************
                             **************/
----                 441             RSEG  ?PR?C_OSCtxSw?OS_CPU_C
0000                 442     C_OSCtxSw:
0000 C000     F      443         PUSH    Os_Enter_Sum            ;保存关中断计数器
0002 AA81            444         mov     r2,sp
                     445         
                     446     ;     cp1 = (unsigned char idata *)SP +1;
0004 A881            447         MOV     R0,SP
                     448     
                     449     IF 0  <> 0
                                 mov     sp,#(Sp2-1)             ;堆栈指向临时空间,允许“软非屏蔽中断”
                             ENDIF
                     452     
0006 08              453         INC     R0
                     454     ;     temp = (unsigned char )OSTsakStackBotton[OSNextTaskID+1];
0007 7400     F      455         MOV     A,#LOW (OSTsakStackBotton+01H)
0009 2500     F      456         ADD     A,OSNextTaskID
000B F9              457         MOV     R1,A
000C E7              458         MOV     A,@R1
000D FF              459         MOV     R7,A
                     460     ;     cp2 = OSTsakStackBotton[OSTaskID+1];
000E 7400     F      461         MOV     A,#LOW (OSTsakStackBotton+01H)
0010 2500     F      462         ADD     A,OSTaskID
0012 F9              463         MOV     R1,A
0013 E7              464         MOV     A,@R1
0014 F9              465         MOV     R1,A
                     466     ;     if( OSNextTaskID > OSTaskID)
0015 E500     F      467         MOV     A,OSNextTaskID
0017 D3              468         SETB    C
0018 9500     F      469         SUBB    A,OSTaskID
001A 4033            470         JC      ?C0001
                     471     ;     {
                     472     ;         while(cp2 != (unsigned char idata *)temp)
                     473     ;         {
                     474     ;             *cp1++ = *cp2++;
                     475     ;         }
001C EF              476         MOV     A,R7
001D C3              477         CLR     C
001E 99              478         SUBB    A,R1
001F FE              479         MOV     R6,A
0020                 480     ?C0002:
0020 E7              481         MOV     A,@R1
0021 F6              482         MOV     @R0,A

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?