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

📄 os_cpu_a.c

📁 UCOS_II移植的(MEGA16,CVAVR)
💻 C
字号:

#include "uCOS_II.H"   

#define PUSH_ALL() \
        #asm ("ST -Y,R0");\
        #asm ("ST -Y,R1");\
        #asm ("ST -Y,R2");\
        #asm ("ST -Y,R3");\
        #asm ("ST -Y,R4");\
        #asm ("ST -Y,R5");\
        #asm ("ST -Y,R6");\
        #asm ("ST -Y,R7");\
        #asm ("ST -Y,R8");\
        #asm ("ST -Y,R9");\
        #asm ("ST -Y,R10");\
        #asm ("ST -Y,R11");\
        #asm ("ST -Y,R12");\
        #asm ("ST -Y,R13");\
        #asm ("ST -Y,R14");\
        #asm ("ST -Y,R15");\
        #asm ("ST -Y,R16");\
        #asm ("ST -Y,R17");\
        #asm ("ST -Y,R18");\
        #asm ("ST -Y,R19");\
        #asm ("ST -Y,R20");\
        #asm ("ST -Y,R21");\
        #asm ("ST -Y,R22");\
        #asm ("ST -Y,R23");\
        #asm ("ST -Y,R24");\
        #asm ("ST -Y,R25");\
        #asm ("ST -Y,R26");\
        #asm ("ST -Y,R27");\
        #asm ("ST -Y,R30");\
        #asm ("ST -Y,R31");
                   
#define POP_ALL() \
        #asm ("LD R31,Y+");\
        #asm ("LD R30,Y+");\
        #asm ("LD R27,Y+");\
        #asm ("LD R26,Y+");\
        #asm ("LD R25,Y+");\
        #asm ("LD R24,Y+");\
        #asm ("LD R23,Y+");\
        #asm ("LD R22,Y+");\
        #asm ("LD R21,Y+");\
        #asm ("LD R20,Y+");\
        #asm ("LD R19,Y+");\
        #asm ("LD R18,Y+");\
        #asm ("LD R17,Y+");\
        #asm ("LD R16,Y+");\
        #asm ("LD R15,Y+");\
        #asm ("LD R14,Y+");\
        #asm ("LD R13,Y+");\
        #asm ("LD R12,Y+");\
        #asm ("LD R11,Y+");\
        #asm ("LD R10,Y+");\
        #asm ("LD R9,Y+");\
        #asm ("LD R8,Y+");\
        #asm ("LD R7,Y+");\
        #asm ("LD R6,Y+");\
        #asm ("LD R5,Y+");\
        #asm ("LD R4,Y+");\
        #asm ("LD R3,Y+");\
        #asm ("LD R2,Y+");\
        #asm ("LD R1,Y+");\
        #asm ("LD R0,Y+");
        
#define PUSH_SP() \
        #asm ("IN  R16,SPH");\
        #asm ("ST  -Y,R16");\
        #asm ("IN  R16,SPL");\
        #asm ("ST  -Y,R16");

#define POP_SP() \
        #asm ("LD  R16,Y+");\
        #asm ("OUT SPL,R16");\
        #asm ("LD  R16,Y+");\
        #asm ("OUT SPH,R16");

#define PUSH_SREG() \
        #asm ("IN  R16,SREG");\
        #asm ("ST  -Y,R16");

#define POP_SREG() \
        #asm ("LD  R16,Y+");\
        #asm ("OUT SREG,R16");

void OSStartHighRdy(void)
{
	 OSTaskSwHook();

 #asm       
	LDI R16, 1
	STS _OSRunning, R16
	LDS R30, _OSTCBHighRdy
	LDS R31, _OSTCBHighRdy + 1
	
	LD  R28, Z+
	LD  R29, Z+
 #endasm       
 
  POP_SP();
	POP_SREG();
	POP_ALL();
}              

void OSCtxSw(void)
{
  PUSH_ALL();
	PUSH_SREG();
	PUSH_SP();
  
  #asm    
 	LDS R30, _OSTCBCur
	LDS R31, _OSTCBCur + 1
	ST  Z+,	 R28
	ST  Z+,  R29
	
	CALL _OSTaskSwHook  
	
	LDS R16, _OSPrioHighRdy
	STS _OSPrioCur,	R16
	
	LDS R30, _OSTCBHighRdy
	LDS R31, _OSTCBHighRdy + 1
	STS _OSTCBCur, R30
	STS _OSTCBCur + 1, R31
	
	LD  R28, Z+
	LD  R29, Z+
  #endasm      
        
  POP_SP();
	POP_SREG();
	POP_ALL();  
}


void OSIntCtxSw(void)
{	
#asm
	LDS R16, _OSPrioHighRdy
	STS _OSPrioCur,	R16
	
	LDS R30, _OSTCBHighRdy
	LDS R31, _OSTCBHighRdy + 1
	STS _OSTCBCur, R30
	STS _OSTCBCur + 1, R31
	
	LD  R28, Z+
	LD  R29, Z+
#endasm
	POP_SP();
	POP_SREG();
	POP_ALL();
}

OS_CPU_SR OS_CPU_SR_Save(void)
{  
   OS_CPU_SR temp;
	
   #asm
    IN      R16,SREG                    ; Get current state of interrupts disable flag
    MOV     R30,R16;CLI                                 ; Disable interrupts
                                     ; Return original SREG value in R16
   #endasm
}

void OS_CPU_SR_Restore(OS_CPU_SR cpu_sr)
{
	OS_CPU_SR temp;
	temp = cpu_sr;

	#asm 
	  OUT SREG,R16;                //; Restore SREG
	#endasm
}   
     
#pragma savereg-
interrupt [TIM1_OVF] void OSTickISR(void)
{   
  PUSH_ALL();  
  
  #asm
	 IN  R16,SREG         
	 SBR R16,0x80    ;enable interrupt            
   ST  -Y,R16      ;save sreg  
  #endasm
	
	PUSH_SP();
  
  OSIntNesting ++;
  
  if (1 == OSIntNesting)
  {
  #asm

	 LDS R30, _OSTCBCur
	 LDS R31, _OSTCBCur + 1
	 ST  Z+,	 R28
	 ST  Z+,  R29
	
 	#endasm
  }

  TCNT1H = 0x0;
  TCNT1L = 0xE6;//256 - (CPU_CLK_FREQ / OS_TICKS_PER_SEC / 1024);
  
	#asm
     SEI 											 ;enable nest interrupt
  #endasm 
     
  OSTimeTick();           
  OSIntExit();    
   
  POP_SP();
	POP_SREG();
	POP_ALL();
}
#pragma savereg+

⌨️ 快捷键说明

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