📄 os_cpu_a_kexin_cbxpok.c
字号:
/*
*********************************************************************************************************
* uC/OS-II
* 实时内核
*
* (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
* 版权所有
*
* MCU-51 专用代码
* KEIL C51大模式编译
*
* 文件名 : OS_CPU_A.C
* 作者 : Jean J. Labrosse
* 改编 : 柯新 kexin28@126.com 深圳众芯科技有限公司软件部 2007.10.22
*********************************************************************************************************
*/
//#define OS_CPU_GLOBALS
#include "includes.h"
OS_STK *UserStkSP_tmp;
#if CXBP_OK>0
#pragma asm
EXTRN DATA (?C_XBP) ;仿真堆栈指针用于重入局部变量保存
#pragma endasm
#endif
#pragma asm
PUSHALL MACRO
PUSH PSW
PUSH ACC
PUSH B
PUSH DPL
PUSH DPH
MOV A,R0 ;R0-R7入栈
PUSH ACC
MOV A,R1
PUSH ACC
MOV A,R2
PUSH ACC
MOV A,R3
PUSH ACC
MOV A,R4
PUSH ACC
MOV A,R5
PUSH ACC
MOV A,R6
PUSH ACC
MOV A,R7
PUSH ACC
ENDM
#pragma endasm
#pragma asm
POPALL MACRO
POP ACC ;R0-R7出栈
MOV R7,A
POP ACC
MOV R6,A
POP ACC
MOV R5,A
POP ACC
MOV R4,A
POP ACC
MOV R3,A
POP ACC
MOV R2,A
POP ACC
MOV R1,A
POP ACC
MOV R0,A
POP DPH
POP DPL
POP B
POP ACC
POP PSW
ENDM
#pragma endasm
void OSCtxSw(void)
{
OS_STK idata *SysStkSP;
OS_STK *UserStkSP;
INT8U STKCount;
#pragma asm
PUSHALL
#pragma endasm
SysStkSP=UserSysSP_Start;
STKCount=SP-UserSysSP_Start;
UserStkSP=OSTCBCur->OSTCBStkPtr;
*UserStkSP=STKCount;
do
{
SysStkSP++;
UserStkSP++;
*UserStkSP=*SysStkSP;
STKCount--;
}while(STKCount!=0);
#if CXBP_OK>0
UserStkSP++;
UserStkSP_tmp=UserStkSP;
#pragma asm
MOV R0,#LOW (UserStkSP_tmp)
;MOV R0,#UserStkSP_tmp
;INC R0
;MOV DPH,@R0 ;变量 UserStkSP_tmp 在IDATA中
;INC R0
;MOV DPL,@R0
;保存仿真堆栈指针?C_XBP
MOV A,?C_XBP ;?C_XBP 仿真堆栈指针高8位
;MOVX @DPTR,A
MOVX @R0,A
INC R0
;INC DPTR
MOV A,?C_XBP+1 ;?C_XBP 仿真堆栈指针低8位
;MOVX @DPTR,A
MOVX @R0,A
#pragma endasm
#endif
OSTaskSwHook();
OSTCBCur=OSTCBHighRdy;
OSPrioCur=OSPrioHighRdy;
UserStkSP=OSTCBCur->OSTCBStkPtr;
SysStkSP=UserSysSP_Start;
STKCount=*UserStkSP;
SP=UserSysSP_Start+STKCount;
do{
UserStkSP++;
SysStkSP++;
*SysStkSP=*UserStkSP;
STKCount--;
}while(STKCount!=0);
#if CXBP_OK>0
UserStkSP++;
UserStkSP_tmp=UserStkSP;
#pragma asm
MOV R0,#LOW (UserStkSP_tmp)
;MOV R0,#UserStkSP_tmp
;INC R0
;MOV DPH,@R0 ;变量UserStkSP在IDATA中
;INC R0
;MOV DPL,@R0
;MOVX A,@DPTR
MOVX A,@R0
MOV ?C_XBP,A ;?C_XBP 仿真堆栈指针高8位
;INC DPTR
INC R0
;MOVX A,@DPTR
MOVX A,@R0
MOV ?C_XBP+1,A ;?C_XBP 仿真堆栈指针低8位
#pragma endasm
#endif
#pragma asm
POPALL
RETI
#pragma endasm
}
void OSTickISR(void) interrupt 1
{
/* OS_STK idata *SysStkSP;
OS_STK *UserStkSP;
INT8U STKCount;*/
TR0=0;
TH0=0x70;
TL0=0x00;
TR0 = 1;
OSIntEnter();
/* if (OSIntNesting == 1)
{
SysStkSP=UserSysSP_Start;
STKCount=SP-UserSysSP_Start;
UserStkSP=OSTCBCur->OSTCBStkPtr;
*UserStkSP=STKCount;
do
{
SysStkSP++;
UserStkSP++;
*UserStkSP=*SysStkSP;
STKCount--;
}while(STKCount!=0);
} */
OSTimeTick();
OSIntExit();
}
void OSIntCtxSw(void)
{
OS_STK idata *SysStkSP;
OS_STK *UserStkSP;
INT8U STKCount;
OSTaskSwHook();
OSTCBCur=OSTCBHighRdy;
OSPrioCur=OSPrioHighRdy;
UserStkSP=OSTCBCur->OSTCBStkPtr;
SysStkSP=UserSysSP_Start;
STKCount=*UserStkSP;
// STKCount-=4;
SP=UserSysSP_Start+STKCount;
do{
UserStkSP++;
SysStkSP++;
*SysStkSP=*UserStkSP;
STKCount--;
}while(STKCount!=0);
#if CXBP_OK>0
UserStkSP++;
UserStkSP_tmp=UserStkSP;
#pragma asm
MOV R0,#LOW (UserStkSP_tmp)
;MOV R0,#UserStkSP_tmp
;INC R0
;MOV DPH,@R0 ;变量UserStkSP在IDATA中
;INC R0
;MOV DPL,@R0
;MOVX A,@DPTR
MOVX A,@R0
MOV ?C_XBP,A ;?C_XBP 仿真堆栈指针高8位
;INC DPTR
INC R0
;MOVX A,@DPTR
MOVX A,@R0
MOV ?C_XBP+1,A ;?C_XBP 仿真堆栈指针低8位
#pragma endasm
#endif
#pragma asm
POPALL
RETI
#pragma endasm
}
void OSStartHighRdy(void)
{
OS_STK idata *SysStkSP;
OS_STK *UserStkSP;
INT8U STKCount;
OSTaskSwHook();
SysStkSP=UserSysSP_Start;
OSTCBCur=OSTCBHighRdy;
OSPrioCur=OSPrioHighRdy;
UserStkSP=OSTCBCur->OSTCBStkPtr;
STKCount=*UserStkSP;
SP=UserSysSP_Start+STKCount;
do{
UserStkSP++;
SysStkSP++;
*SysStkSP=*UserStkSP;
STKCount--;
}while(STKCount!=0);
#if CXBP_OK>0
UserStkSP++;
UserStkSP_tmp=UserStkSP;
#pragma asm
MOV R0,#LOW (UserStkSP_tmp)
;MOV R0,#UserStkSP_tmp
;INC R0
;MOV DPH,@R0 ;变量UserStkSP在IDATA中
;INC R0
;MOV DPL,@R0
;MOVX A,@DPTR
MOVX A,@R0
MOV ?C_XBP,A ;?C_XBP 仿真堆栈指针高8位
;INC DPTR
INC R0
;MOVX A,@DPTR
MOVX A,@R0
MOV ?C_XBP+1,A ;?C_XBP 仿真堆栈指针低8位
#pragma endasm
#endif
OSRunning = 1;
#pragma asm
POPALL
RETI
#pragma endasm
}
#if SERIAL_OK>0
void SerialISR(void) reentrant interrupt 4 using 0
{
// EA=0;
OSIntEnter();
serial();
// EA=1;
OSIntExit();
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -