📄 task_switch.c
字号:
#include <AT89X52.H>
#include "os_core.h"
#include "main.h"
#include "task_switch.h"
#include "sem.h"
#include "q.h"
#include "uart.h"
///////////////////任务主动切换函数/////////////////////////////////
void OSSched(void)
{
EA=0; //关中断
OS_TCB[OS_Current_ID].Task_SP=SP; //保存当前堆栈指针
Task_Int_List&=~OSMapTbl[OS_Current_ID];
OS_Find_Next_Task();
SP=OS_TCB[OS_Current_ID].Task_SP; //任务堆栈指针切换
if(Task_Int_List&OSMapTbl[OS_Current_ID])
{
__asm POP 7
__asm POP 6 //恢复任务寄存器
__asm POP 5
__asm POP 4
__asm POP 3
__asm POP 2
__asm POP 1
__asm POP 0
__asm POP PSW
__asm POP DPL
__asm POP DPH
__asm POP B
__asm POP ACC
}
EA=1;
__asm RETI
}
///////////////////////////中断退出处理函数////////////////////////////////////
void Exit_Int(void)
{
SP-=2; //去除因调用而入栈的PC
if(--Int_count==0) //最后一层
{
OS_TCB[OS_Current_ID].Task_SP=SP; /*保存当前堆栈指针*/
Task_Int_List|=OSMapTbl[OS_Current_ID];
OS_Find_Next_Task();
SP=OS_TCB[OS_Current_ID].Task_SP; //任务堆栈指针切换
if(Task_Int_List&OSMapTbl[OS_Current_ID])
{
goto bb;
}
EA=1;
__asm RETI
}
bb:
__asm POP 7
__asm POP 6 //恢复任务寄存器
__asm POP 5
__asm POP 4
__asm POP 3
__asm POP 2
__asm POP 1
__asm POP 0
__asm POP PSW
__asm POP DPL
__asm POP DPH
__asm POP B
__asm POP ACC
EA=1;
__asm RETI
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -