📄 复件 os_cpu_a.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"
#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);
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);
#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;
SP=UserSysSP_Start+STKCount;
do{
UserStkSP++;
SysStkSP++;
*SysStkSP=*UserStkSP;
STKCount--;
}while(STKCount!=0);
#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);
OSRunning = 1;
#pragma asm
POPALL
RETI
#pragma endasm
}
void SerialISR(void) interrupt 4 //using 0
{
#pragma asm
PUSHALL
#pragma endasm
EA=0;
serial();
EA=1;
#pragma asm
POPALL
RETI
#pragma endasm
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -