⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 复件 os_cpu_a.c

📁 移植UCOS2.00版内核到8051
💻 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 + -