⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 task_switch.c

📁 模仿ucos ii和RTX Tiny写的一个小操作系统
💻 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 + -