#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar temp,i;
void taskA()
{
while(1)
{
temp=0x01;
for(i=0;i<8;i++)
{
delay(800);
P1=temp;
temp=temp<<1;
}
}
}
void taskB()
{
while(1)
{
P2+=1;
delay(1000);
}
}
void * const func[]={taskA,taskB};
uchar *pstk1,*pstk2,flag=0,num=0;
main()
{
EX0=1;
IT0=1;//下降沿触发模式
// IT0=0;//低电平触发模式,只要int0管脚为低电平就会进入中断,直到该引脚变为高电平才退出中断。
EA=1;
while(1);
}
void exint0() interrupt 0
{
uchar idata *p;
if(num==1) pstk1=(uchar *)SP;//num=1表示第二次进入中断(主函数中没有任务运行),在进入任务后产生的中断,这时保存该任务的进入中断前的堆栈指针
if(num<2)
{
p=(uchar *)SP+1;
*p++=((uint)(func[num]))%256;
*p=((uint)(func[num]))/256;
SP=(uchar)p;
SP+=10;
num++;
}
else
{
if(flag) //当num=2同时首次进入这个if语句时,要保证flag是等于0进入else语句,以便保存另一个任务的进入中断前的堆栈指针
{
pstk1=(uchar *)SP;
SP=(uchar)pstk2;
}
else
{
pstk2=(uchar *)SP;
SP=(uchar)pstk1;
}
flag=!flag;
}
}
//此程序是通过外部中断来切换的,但是切换时对堆栈的使用上存在问题.
//该程序的目的不是展示完美的任务级切换,主要是如何切换的问题.呵呵
死循环之间穿梭(51操作系统之抢占式任务切换)
最新推荐文章于 2022-10-19 17:38:20 发布