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 + -
显示快捷键?