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

📄 sw_int.c

📁 基本STC4052写的一个小的OS, 完成了任务调度功能,及堆栈空间切换, 及中断处理
💻 C
字号:

//////////////////////////////////////////////////////////////////
//                          
//      Copyright (c) 2006-2010 walnutcy 
//      All Right Reserved.       
//                                 
//      $Author    walnutcy           
//      $Email     walnutcy@163.com   
//      $Version   v1.0        
//      $FileName        
//      $Since       
//      $Log     
//                    
//      DESCRIPTION      
//                      
//	    History:      
//	    <author>          <time>     <version >    <desc>     
//      walnutcy       2006-11-22      0.1          建立
//////////////////////////////////////////////////////////////////

#include "includes.h"

U8 sys10ms;


#pragma asm
;/////////////////////////////////////////////////
;////////add by walnutcy 2006-11-22
;				PUBLIC  PUSHALL
PUSHALL MACRO 
;;;;;;;;;;;;;;;;;;;;;;
	    PUSH	ACC		 
	    PUSH	B		 
	    PUSH	PSW		 
	    MOV	PSW,#0x00
	    PUSH	DPL		 
	    PUSH	DPH		 
	    PUSH	0x00	 
	    PUSH	0x01	 
	    PUSH	0x02	 
	    PUSH	0x03	 
	    PUSH	0x04	 
	    PUSH	0x05	 
	    PUSH	0x06	 
	    PUSH	0x07	
;;;;;;;;;;;;;;;;;;;;;;;;;;		 
        ENDM

POPALL	MACRO
;;;;;;;;;;;;;;;;;;;;
		POP		0x07
		POP		0x06
		POP		0x05
		POP		0x04
		POP		0x03
		POP		0x02
		POP		0x01
		POP		0x00
		POP		DPH 
		POP		DPL 
		POP		PSW 
		POP		B   
		POP		ACC 		    
;;;;;;;;;;;;;;;;;;;;;;;;
		ENDM
;/////////////////////////////////////////////////
#pragma	endasm

void OsTaskSwitch (void) REENTRANT
{
	U8 tmp;
	U8 tmpsp1;
	U8 tmpsp2;
	if (gOsShedLock)
	{	return;
	}
	__asm POP DPL
	__asm POP DPH
	if (1==gOsIntLevel)
	{
		tmpsp1 = DPL;
		tmpsp2 = DPH;
		__asm POP DPL
		__asm POP DPH 

	}
	tmp = gOs.currTask;
	gOs.tcb[tmp].sp = SP;

	if (OS_TASK_RUN==gOs.tcb[tmp].state)
	{
		gOs.tcb[tmp].state = OS_TASK_RDY; 
	}
	for(tmp=0;tmp<OS_TASK_MAX_NUM;tmp++)
	{
		if (gOs.osPrio&(1<<tmp))
		{ 	
			if (OS_TASK_RDY==gOs.tcb[tmp].state)
			{
				gOs.tcb[tmp].state = OS_TASK_RDY;				
				gOs.currTask = tmp;
				SP = gOs.tcb[tmp].sp;
				break;	
			}
		}		
	}
	__asm PUSH DPH
	__asm PUSH DPL
	if (1==gOsIntLevel)
	{
		DPH = tmpsp2;
		DPL = tmpsp1;
		__asm PUSH DPH
		__asm PUSH DPL
	}
}

void OsIntExit (void) REENTRANT
{
	EnterCritical();
	if (gOs.taskNum>1)
	{	
		if (0==gOsMsgIntShed)
		{	ExitCritical(); 
			return;
		}
		gOsMsgIntShed = 0;
		if (1==gOsIntLevel)
		{
			OsTaskSwitch();
		}
	}
	ExitCritical();
}

void IR_CaptureInt6() //interrupt 6
{
	U16 tmp;
#pragma asm
	PUSHALL
#pragma endasm
	gOsIntLevel++;
    if (CCF1)// PCA module 1 : IR 
    {
        CCF1 = 0;
        IR_Decode();
    }
#if 1
    if (CCF0)// PCA module 0 : 
    {
		CCF0 = 0;
		tmp = CCAP0H;
    	tmp = (tmp << 8) + CCAP0L; 
		tmp += SYS_TIME_TICK;
		CCAP0L = tmp & 0xff;
    	CCAP0H = tmp >> 8;
    }
#endif
//  if (CF)  // PCA timer overflow
//  {
//      CF = 0;        
//  }

	OsIntExit();
	if (gOsIntLevel)
		gOsIntLevel--;	
#pragma asm
	POPALL
	RETI	    
#pragma endasm
}



void SysTimer0 (void)// interrupt 1  //FC66 1ms
{ 
#pragma asm
	PUSHALL
#pragma endasm
 	gOsIntLevel++; 

	TH0	=0xFC;
	TL0=0x67;
	TR0=1;
	sysTimeTick++ ;

#ifdef OS_DELAY
	OsDealDelay();
#endif

	sys10ms++;
	if (10==sys10ms)
	{	sys10ms = 0;
#ifdef SET_TIMER
		Timer10msProc();
#endif	
//		isNeedTaskSW = 1;
		gOsMsgIntShed = 1;
		OsIntExit();			
	}
	if (gOsIntLevel)
		gOsIntLevel--;	
#pragma asm
	POPALL
	RETI	    
#pragma endasm
}

void UartISR (void) //interrupt 4 
{
	U8 tmp;
#pragma asm
	PUSHALL
#pragma endasm	 
	gOsIntLevel++; 
	if (RI)// receive
	{		
	    RI = 0;
	  	tmp = SBUF;
//		SBUF = tmp;
//		while (!TI);
//		TI=0;
	  	SRL_RevChar(tmp);
	}
	OsIntExit();
	if (gOsIntLevel)
		gOsIntLevel--;	
#pragma asm
	POPALL
	RETI
#pragma endasm
}


void OSTaskSW (void) REENTRANT
{
	EnterCritical();
#pragma asm
	PUSHALL
#pragma endasm
	if (gOs.taskNum<2)
	{	return;//只有一个任务在运行
	}
	OsTaskSwitch();
#pragma asm
	POPALL	    
#pragma endasm
	ExitCritical();
}


void ISRAdrFun (void)  REENTRANT
{
#pragma asm
	   NOP				//3
	   NOP
	   NOP
	   NOP				//6
	   NOP
	   NOP
	   NOP
	   NOP				//0A

	   LJMP SysTimer0	//0B
;	   NOP
;	   NOP
	   NOP
	   NOP
;;//////////////////////////////////
	   NOP				//10
	   NOP
	   NOP
	   NOP
	   NOP
	   NOP

	   NOP
	   NOP
	   NOP
	   NOP
	   NOP				//1A

	   NOP				//1B
	   NOP
	   NOP
	   NOP
	   NOP
;;//////////////////////////////////
	   NOP				//20
	   NOP
	   NOP
	   LJMP UartISR 	//23
;	   NOP
;	   NOP

	   NOP
	   NOP
	   NOP
	   NOP
	   NOP				//2A

	   NOP				//2B
	   NOP
	   NOP
	   NOP
	   NOP
;;//////////////////////////////////
	   NOP				//30
	   NOP
	   NOP
	   LJMP IR_CaptureInt6 	//33
;	   NOP
;	   NOP

	   NOP
	   NOP
	   NOP
	   NOP
	   NOP				//3A

	   NOP				//3B
	   NOP
	   NOP
	   NOP
	   NOP
;;//////////////////////////////////
	   NOP				//40
	   NOP
	   NOP
	   NOP			 
	   NOP
	   NOP

	   NOP
	   NOP
	   NOP
	   NOP
	   NOP				//4A

	   NOP				//4B
	   NOP
	   NOP
	   NOP
	   NOP
#pragma endasm

}

⌨️ 快捷键说明

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