您的位置:首页 > 其它

死循环之间穿梭(51操作系统之任务主动放弃cpu控制权)

2015-08-28 15:52 211 查看
[align=center][/align]

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

void cswitch();

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(300);

P1=temp;

temp=temp<<1;

cswitch();

}

}

}

void taskB()

{

while(1)

{

P2+=1;

delay(300);

cswitch();

}

}

void taskC()

{

while(1)

{

P3+=2;

delay(300);

cswitch();

}

}

void * const func[]={taskA,taskB,taskC};

uchar tasknum=0;

uchar stk[3*2];

main()

{

uchar num,j;

tasknum=0;

for(;num<3;num++,j+=2)

{

stk[j]=((uint)(func[num]))%256;

stk[j+1]=((uint)(func[num]))/256;

}

// taskA();

cswitch();

}

void cswitch()

{

uchar idata *ssp;

ssp=(uchar *)SP-1;

if(tasknum>=1)

{

tasknum--;

stk[tasknum++]=*ssp++;

stk[tasknum++]=*ssp;

ssp--;//注意:这里不能直接对SP进行只增或减操作,这样会造成堆栈溢出

if(tasknum>5)

tasknum=0;

}

*ssp++=stk[tasknum++];

*ssp=stk[tasknum];

}

该程序主要是通过任务自己调用切换函数,所以相当于一般函数调用那样,不需要将寄存器压入堆栈的操作.直接恢复PC指针就可以了.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: