task_switch.c
来自「模仿ucos ii和RTX Tiny写的一个小操作系统」· C语言 代码 · 共 91 行
C
91 行
#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 + =
减小字号Ctrl + -
显示快捷键?