51操作系统之延时实现源代码
来源:互联网 发布:流量推广软件 编辑:程序博客网 时间:2024/06/03 10:53
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define tasknumsize 3
uint idata wait[tasknumsize];
uchar taskrdy=0xff,curtask,nxttask;
void cswitch();
void waitdly(uint dly);
void taskA()
{
uchar temp,i;
while(1)
{
temp=0x01;
for(i=0;i<8;i++)
{
P1=temp;
temp=temp<<1;
waitdly(10);
}
}
}
void taskB()
{
while(1)
{
P2+=1;
waitdly(20);
}
}
void taskC()
{
while(1)
{
P3+=2;
waitdly(30);
}
}
void init()
{
TMOD=0x01;//方式1,16位模式,不会自动清零。
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
EA=1;
ET0=1;
}
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;
}
init();
taskA();
}
void cswitch()
{
uchar idata *ssp;
uchar temp;
ssp=(uchar *)SP-3; //这里是改变waitdly()函数的返回指针来实现任务的切换的
tasknum=curtask;
stk[tasknum*2]=*ssp++; //保存当前任务的返回指针
stk[tasknum*2+1]=*ssp;
ssp--;
temp=taskrdy;
for(nxttask=0;nxttask<tasknumsize;nxttask++)
{
if((temp & 0x80)!=0)
break;
temp=temp<<1;
}
tasknum=nxttask;
*ssp++=stk[tasknum*2]; //使将要运行任务的返回指针放入堆栈中,进行任务切换.
*ssp=stk[tasknum*2+1];
curtask=nxttask;
}
void waitdly(uint dly)
{
wait[curtask]=dly;
while(wait[curtask]!=0)
{
taskrdy &= ~(0x80>>curtask); //挂起当前任务
cswitch();
}
}
void timer0() interrupt 1
{
uchar t;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
for(t=0;t<tasknumsize;t++)
{
if(wait[t]>0)
{
wait[t]--;
if(wait[t]==0)
taskrdy |= (0x80>>t);//使任务进入就绪态
}
}
}
注意:本程序只是展示如何实现,其中还存在问题并不很完美. 呵呵
- 51操作系统之延时实现源代码
- QT之实现延时
- 《操作系统实现之路》源代码下载路径及求助途径
- MySQL延时备份之实现
- 实时操作系统中实现自己的udelay延时函数
- 实时操作系统延时问题
- Android开发之延时跳转实现方法
- 操作系统实验一之进程管理源代码
- 操作系统实现之路
- 操作系统之线程实现
- 二维码扫描重复扫描实现之handler延时实现
- 嵌入式实时操作系统中断延时
- 操作系统总结之文件系统实现
- 操作系统总结之文件系统实现
- 操作系统之loader的实现
- 操作系统实现之保护模式
- 操作系统之loader的实现
- 操作系统实现之保护模式
- hdoj-2015 偶数求和【水】
- 1023. Have Fun with Numbers (20)
- zzuli OJ 1026: 字符类型判断
- iOS 企业应用的发布要点
- 微信企业号开发:微信考勤摇一摇考勤
- 51操作系统之延时实现源代码
- getview所犯低级错误
- zzuli OJ 1027: 判断水仙花数
- python shape tile **(幂运算)
- OScache为web配置缓存
- AndroidStudio常用快捷键
- Qt编程中QDiaog的ESC建
- ios 进程、 线程、多线程
- iOS更改UISearchBar里面的UITextField的frame以及去除UISearchBar的背景