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

📄 isr.c

📁 MCS-51的一个小型操作系统,在KeilC中大模式下编译工作
💻 C
字号:
/********************************************
        嵌入式系统 小型操作系统
		 作者:汪普宏
	    制作日期:2006.9
*********************************************/
	
#include "os.h"
#include "OS_Mail.h"
#include "OS_Memory.h"
/****************************************
模块功能:系统时钟中断函数,中断级任务调度
模块接口:当前任务优先级,任务就绪表
调用者:无
返回值:  无
*****************************************/

void tiem1(void)interrupt 3  	
{  
 uchar  i;
 ISR_num++;
 TH1 = (-SYSCLK*SYTIMEISR/12000) >> 8;    		// set Timer0 to overflow in 1ms
 TL1 = -SYSCLK*SYTIMEISR/12000;
 TR1=1;
 OS_CLOSEISR;
 for(i=0;i<N;i++)	   //任务延迟时间计数
 {
      if(OSPCB[i].timedal)
      {
		   OSPCB[i].timedal--;
   	       if(!OSPCB[i].timedal)
		   {
				OS_RdyTask(i);
		   }
	  }
	  else if(OSPCB[i].flg!=WAIT_MSG)
	  {
		   OS_RdyTask(i);      //使一个任务就绪
	  }
  } 
 if(ISR_num==1)
 { 
	  OSISR_Task_Sched();            //切换任务调用,关中断
 }
 OS_OPENISR;
 ISR_num--;	 
}

/****************************************
函数功能:任务调度
模块接口:当前任务优先级,任务就绪表
调用者:中断函数或任务级调度函数
返回值:  无
*****************************************/
extern uchar xdata Task_Free_Stack[FREE_SP];
void  OSISR_Task_Sched(void)			
{
 uchar i,newprio,x,y,len;
 uchar data *p;
 uchar xdata *tp;
 uchar addr_h,addr_l;
 uchar data *sp_top=SP-1;
 y=OSUnMapTab[OSRdyGrp];
 x=OSUnMapTab[OSRdyTab[y]];	     //判断任务优先级
 newprio=(y<<3)+x;
 if(newprio!=Prio)
 {	  addr_l=*sp_top;
      addr_h=*(sp_top+1);
	  SP=p=spend;
	  OSPCB[Prio].sp_size=len=sp_top-spend;
	  tp=OSPCB[Prio].sp_start;
	  for(i=0;i<len;i++)
          {
		   *(tp+i)=*p++;    //保存当前任务堆栈 
		   }
	  Prio=newprio;
	  SP=p=spend;
	  SP+=len=OSPCB[newprio].sp_size;
	  tp=OSPCB[newprio].sp_start;
	   for(i=0;i<len;i++)
          {
		   *p++=*(tp+i);	//恢复新任务堆栈
		   } 
	  sp_top=SP++;
      *sp_top++=addr_l;
      *sp_top=addr_h;
 }
 
}
/****************************************
函数功能:任务就绪表查询
模块接口:需要就绪的任务优先级
调用者:  任务调度函数
返回值:  无
*****************************************/
void OS_RdyTask(uchar prio)	        //使一个任务就绪
{
 OS_CLOSEISR;
 OSRdyGrp|=OSMapTab[prio>>3];
 OSRdyTab[prio>>3]|=OSMapTab[prio&0x07];  
 OSPCB[prio].flg=READY;
 OS_OPENISR;
}
uchar code  OSMapTab[]=
{
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
};
uchar code OSUnMapTab[]=
{ 0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
 
  4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
  5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
  4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
  6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
  4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
  5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
  4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
  7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
  4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
  5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
  4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
  6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
  4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
  5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
  4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
}; 	  
			  
			  
			  
			  
			  	   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -