?? os_cpu_a.asm
字號:
;*********************************************************************************************************
;** Small RTOS 51
;** The Real-Time Kernel For Keil c51
;**
;** (c) Copyright 2002-2003, chenmingji
;** All Rights Reserved
;**
;** V1.12.1
;**
;**
;**--------------------文件信息---------------------------------------------------------------------------
;**文 件 名: OS_CPU_A.ASM
;**創 建 人: 陳明計
;**版 本: V1.12.1
;**最后修改日期: 2002年2月5日
;**描 述: Small RTOS 51 與CPU(8051系列)相關的匯編程序
;**---------------------歷史版本信息----------------------------------------------------------------------
;** 創建人: 陳明計
;** 版 本:V0.50
;** 日 期: 2002年2月22日
;** 描 述: 原始版本
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陳明計
;** 版 本: V1.00
;** 日 期: 2002年6月10日
;** 描 述: 支持軟的非屏蔽中斷
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陳明計
;** 版 本: V1.10.3
;** 日 期: 2002年9月16日
;** 描 述: 修改了LoadCtx代碼使之執行更快,代碼更小
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陳明計
;** 版 本: V1.10.4
;** 日 期: 2002年10月5日
;** 描 述: 將OS_CPU_A.ASM和OS_CPU_A_task16.ASM合并
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陳明計
;** 版 本: V1.11.0
;** 日 期: 2002年12月2日
;** 描 述: 根據新版本要求使任務堆棧包含Os_Enter_Sum,使優先級最低
;** 的任務只保存少量寄存器;增加注釋
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陳明計
;** 版 本: V1.12.0
;** 日 期: 2002年12月30日
;** 描 述: 根據新版本要求更改少量代碼
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陳明計
;** 版 本: V1.12.1
;** 日 期: 2002年2月5日
;** 描 述: 更正LoadCtx中OS_MAX_TASKS為8或16的bug
;**---------------------當前版本修訂-----------------------------------------------------------------------
;** 修改人:
;** 日 期:
;** 描 述:
;**
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
#include "OS_CPU.H"
#include "OS_CFG.H"
#if EN_REENTRANT > 0
#define SP_ADD_BYTE 5
#else
#define SP_ADD_BYTE 3
#endif
NAME OS_CPU_A_ASM
?PR?OSCtxSw?OS_CPU_A SEGMENT CODE
?PR?OSIntCtxSw?OS_CPU_A SEGMENT CODE
?PR?LoadCtx?OS_CPU_A SEGMENT CODE
?PR?C_OSCtxSw?OS_CPU_A SEGMENT CODE
?PR?_OSTaskStkInit?OS_CPU_A SEGMENT CODE
EXTRN CODE (OSMapTbl)
EXTRN DATA (OSFastSwap)
EXTRN DATA (OSTaskID)
EXTRN DATA (OSNextTaskID)
EXTRN DATA (OSTsakStackBotton)
EXTRN DATA (Os_Enter_Sum)
IF EN_SP2 <> 0
EXTRN IDATA (Sp2)
ENDIF
IF EN_REENTRANT > 0
EXTRN DATA (?C_XBP)
ENDIF
PUBLIC _OSTaskStkInit
PUBLIC LoadCtx
PUBLIC OSIntCtxSw
PUBLIC OSCtxSw
PUBLIC STACK
PUBLIC C_OSCtxSw
;****************************************************************************************
;?STACK SEGMENT IDATA
?STACK SEGMENT IDATA
RSEG ?STACK
STACK: ;堆棧
DS 1
; /*********************************************************************************************************
; ** 函數名稱: OSTaskStkInit
; ** 功能描述: 任務堆棧初始化
; ** 輸 入: 無
; ** 輸 出 : 無
; ** 全局變量: OSTaskID,OSTsakStackBotton,SP
; ** 調用模塊: LoadCtx
; **
; ** 作 者: 陳明計
; ** 日 期: 2002年2月22日
; **-------------------------------------------------------------------------------------------------------
; ** 修改人:
; ** 日 期:
; **-------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
RSEG ?PR?_OSTaskStkInit?OS_CPU_A
_OSTaskStkInit:
USING 0
;---- Variable 'cp?147' assigned to Register 'R0' ----
;---- Variable 'cp?146' assigned to Register 'R1' ----
;---- Variable 'i?145' assigned to Register 'R2' ----
;---- Variable 'TaskID?144' assigned to Register 'R3' ----
;---- Variable 'ptos?143' assigned to Register 'R4/R5' ----
PUSH AR6
PUSH AR7
; {
#if OS_MAX_TASKS < 9
; OSFastSwap[0] &= ~OSMapTbl[TaskID];
MOV A,R3
MOV DPTR,#OSMapTbl
MOVC A,@A+DPTR
ORL OSFastSwap,A
#else
; if (TaskID < 8)
MOV A,R3
CLR C
SUBB A,#08H
MOV A,R3
JNC StkInit07
; {
; OSFastSwap[1] &= ~OSMapTbl[TaskID];
MOV DPTR,#OSMapTbl
MOVC A,@A+DPTR
ORL OSFastSwap+1,A
; }
SJMP StkInit08
StkInit07:
; else
; {
; OSFastSwap[0] &= ~OSMapTbl[TaskID & 0x07];
ANL A,#07H
MOV DPTR,#OSMapTbl
MOVC A,@A+DPTR
ORL OSFastSwap,A
; }
StkInit08:
#endif
; if (TaskID < OSRunningTaskID())
MOV A,R3
CLR C
SUBB A,OSTaskID
JNC StkInit5
; {
; i = OSRunningTaskID() - TaskID;
CLR C
MOV A,OSTaskID
SUBB A,R3
MOV R2,A
; cp = (uint8 idata *)(&(OSTsakStackBotton[TaskID + 1]));
MOV A,#LOW (OSTsakStackBotton+01H)
ADD A,R3
MOV R1,A
StkInit8:
; do
; {
; *cp += SP_ADD_BYTE;
MOV A,#SP_ADD_BYTE
ADD A,@R1
MOV @R1,A
; cp++;
INC R1
; } while (--i != 0);
DJNZ R2,StkInit8
; cp1 = (uint8 idata *)SP;
MOV R0,SP
; SP = SP + SP_ADD_BYTE;
; SOURCE LINE # 172
MOV A,#SP_ADD_BYTE
ADD A,SP
MOV SP,A
; i = SP - (uint8)(OSTsakStackBotton[TaskID + 1]) + 1;
MOV A,#LOW (OSTsakStackBotton+01H)
ADD A,R3
MOV R1,A
MOV AR7,@R1
CLR C
MOV A,SP
SUBB A,R7
MOV R2,A
INC R2
; cp = (uint8 idata *)SP;
MOV R1,SP
StkInit11:
; do
; {
; *cp-- = *cp1--;
MOV A,@R0
MOV @R1,A
DEC R0
DEC R1
; } while (--i != 0);
DJNZ R2,StkInit11
; }
SJMP StkInit12
StkInit5:
; else
; {
; cp1 = (uint8 idata *)(&(OSTsakStackBotton[OSRunningTaskID() + 1]));
MOV A,#LOW (OSTsakStackBotton+01H)
ADD A,OSTaskID
MOV R0,A
; i = TaskID - OSRunningTaskID();
CLR C
MOV A,R3
SUBB A,OSTaskID
MOV R2,A
StkInit15:
; do
; {
; *cp1 -= SP_ADD_BYTE;
MOV A,#(-SP_ADD_BYTE)
ADD A,@R0
MOV @R0,A
; cp1++;
INC R0
; } while (--i != 0);
DJNZ R2,StkInit15
;
; cp = OSTsakStackBotton[OSRunningTaskID() + 1];
MOV A,#LOW (OSTsakStackBotton+01H)
ADD A,OSTaskID
MOV R0,A
MOV A,@R0
MOV R1,A
; i = OSTsakStackBotton[TaskID] - cp - SP_ADD_BYTE;
MOV A,R1
ADD A,#(-SP_ADD_BYTE)
MOV R7,A
MOV A,#LOW (OSTsakStackBotton)
ADD A,R3
MOV R0,A
MOV A,@R0
CLR C
SUBB A,R7
MOV R2,A
; cp1 = cp - SP_ADD_BYTE;
MOV R0,AR7
StkInit18:
; do
; {
; *cp1++ = *cp++;
MOV A,@R1
MOV @R0,A
INC R0
INC R1
; } while (--i != 0);
DJNZ R2,StkInit18
; }
StkInit12:
; cp = OSTsakStackBotton[TaskID];
MOV A,#LOW (OSTsakStackBotton)
ADD A,R3
MOV R0,A
MOV A,@R0
MOV R1,A
; *cp++ = (uint16)task % 256;
pop ACC
MOV @R1,A
INC R1
; *cp++ = (uint16)task / 256;
pop ACC
MOV @R1,A
INC R1
#if EN_REENTRANT > 0
; *cp++ = (uint16)ptos / 256;
MOV @R1,AR4
INC R1
; *cp++ = (uint16)ptos % 256;
MOV @R1,AR5
INC R1
#endif
; *cp = 0;
CLR A
MOV @R1,A
; }
RET
;/*********************************************************************************************************
;** 函數名稱: LoadCtx
;** 功能描述: 任務環境恢復函數
;** 輸 入: OSTaskID,OSFastSwap
;** 輸 出 : 無
;** 全局變量: 無
;** 調用模塊: 無
;**
;** 作 者: 陳明計
;** 日 期: 2002年2月22日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 陳明計
;** 日 期: 2002年12月2日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 陳明計
;** 日 期: 2003年2月5日
;**-------------------------------------------------------------------------------------------------------
;** 修 改:
;** 日 期:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
RSEG ?PR?LoadCtx?OS_CPU_A
LoadCtx:
USING 0
POP Os_Enter_Sum ;恢復關中斷計數器
#if EN_REENTRANT > 0
POP ?C_XBP+1
POP ?C_XBP
#endif
;判斷是否需要恢復所有寄存器
MOV A,OSTaskID
CJNE A,#OS_MAX_TASKS,LoadCtx_0
SJMP LoadCtx_2
LoadCtx_0:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -