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

📄 os_cpu_a.c

📁 small rtos for avr small rtos 使用了动态堆栈 想无需任何改动就可以编译这个程序
💻 C
字号:
/*********************************************************************************************************
**				                               Small RTOS
**                                   The Real-Time Kernel For AVR-GCC
**
**                                  (c) Copyright 2004-2005, xubaotian
**                                           All Rights Reserved
**
**                                                  V 0.1.0
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: OS_CPU_C.c
**创   建   人: 徐宝田
**最后修改日期: 2005年5月30日
**描        述: Small RTOS 与CPU(既ATmega系列)寄存器保护与恢复相关的C语言代码
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 徐宝田
** 版  本: V0.10
** 日 期: 2005年5月30日
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#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;								/*  释放两层函数调用所使用的堆栈  					    */

	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)
{
	SP += 2;

	OSTaskStackBottom[OSTaskID] = (uint16)SP;
	OSTaskID = OSNextTaskID ;
	SP = (uint16)OSTaskStackBottom[OSTaskID];

	LoadCtx();
}

		void LoadCtx(void)
{
	uint8 * cp;

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

	POPALL();   							/*  全部寄存器堆出栈						  	        */

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

⌨️ 快捷键说明

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