📄 os_cpu_a.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 + -