📄 isr.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 + -