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