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

📄 os_cpu_a.c

📁 一个基于MEGA16的GUI
💻 C
字号:
/*********************************************************************************************************
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define _OS_CPU_A_C
#include "CONFIG.H"

extern void * OSTaskStackBottom[OS_MAX_TASKS + 2];	
void LoadCtx(void);
void C_CtxSw(void);
void LinkCtxSw(void);


 		void OSIntCtxSw(void)
{
	uint8 * cp ;
	
	SP += 4;								/*  释放两层函数调用所使用的堆栈  					    */

   	if(OSTaskID == OS_MAX_TASKS)
	{
		SP += 15;
	}
	else
	{
		ExtraPush();						/*	第二部分寄存器堆入栈							    */
	}

	cp = (uint8 *)SP;   
	*cp-- = Os_Enter_Sum ;				    /*  保存关中断计数器								    */
	*cp-- = (uint8)(uint16)LinkCtxSw;
	*cp-- = (uint8)((uint16)LinkCtxSw/256);
	SP = (uint16)cp;
	__asm__ __volatile__("reti");		    /*  模拟中断返回									    */
}
		void LinkCtxSw(void)
{
	cli();					  			    /*  为了在执行RETI指令后立即执行CLI指令而构造的特殊函数	 */
	C_CtxSw();	
}

		void OSCtxSw(void)
{
	uint8 * cp;

	PUSHALL();							   /*  全部寄存器堆入栈  */

 	cp = (uint8 *)SP;
	*cp-- = Os_Enter_Sum ;
	SP = (uint16)cp ;

	C_CtxSw();
}


		void C_CtxSw(void)
{
	uint8 * cp1;
	uint8 * cp2;
	uint8 * cpt;
	uint8 i ;

	SP += 4;
											/*  动态堆栈移动前准备 								*/
	cp1 = (uint8 *)SP ;
	cp2 = (uint8 *)OSTaskStackBottom[OSTaskID+1] ;
	cpt = (uint8 *)OSTaskStackBottom[OSNextTaskID+1] ;

	if(OSNextTaskID>OSTaskID)
	{
	   while(cp2 != cpt)				    /*   堆栈移动									    */
	   {
	   		*cp1-- = *cp2-- ;
	   }
											/*   修改SP,堆栈控制块  */
	   OSTaskID++;
	   OSNextTaskID++;
	   cpt = (uint8 *)SP - (uint16)(OSTaskStackBottom[OSTaskID]) ;
	   SP = (uint16)cp1 ;
	   for(i = OSTaskID;i < OSNextTaskID; i++)
       {
			cp1 = (uint8*)OSTaskStackBottom[i];
			cp1 += (uint16)cpt;
			OSTaskStackBottom[i] = (void*)cp1 ;
       }
	   OSNextTaskID--;
	   OSTaskID = OSNextTaskID ;	   
	}
	else if(OSNextTaskID<OSTaskID)
	{
		while(cp1 != cpt)
		{
			*(++cp2) = *(++cp1) ;
		}

		OSTaskID++;
	   	OSNextTaskID++;
	   	cpt = (uint8 *)SP - (uint16)OSTaskStackBottom[OSTaskID] ;
		SP = (uint16)OSTaskStackBottom[OSNextTaskID] ;
		for(i = OSNextTaskID;i < OSTaskID; i++)
        {
			cp1 = (uint8*)OSTaskStackBottom[i];
			cp1 -= (uint16)cpt;
            OSTaskStackBottom[i] = (void*)cp1;
        }
		OSNextTaskID--;
        OSTaskID = OSNextTaskID;        
	}

	LoadCtx();
}

		void LoadCtx(void)
{
	uint8 * cp;

	SP += 2 ;
	cp = (uint8 *)SP;
	Os_Enter_Sum = *(++cp);								/*  恢复关中断计数器							*/
	SP = (uint16)cp;

	if(OSTaskID != OS_MAX_TASKS)
	{
		POPALL();   									/*  全部寄存器堆出栈						  	*/
	}

	if(Os_Enter_Sum==0)
	{
		sei();
	}
	__asm__ __volatile__("ret");
}

⌨️ 快捷键说明

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