参考了其他网上的例子,改进一下,完美运行。
现贴出程序如下:
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
#define DataPort P0
#define MAX_TASKS 3 //任务槽个数,必须和实际任务数一致
#define MAX_TASK_DEP 10 //最大栈深10
uchar idata task_stack[MAX_TASKS][MAX_TASK_DEP]; //任务堆栈
uchar idata task_id=0; //当前活动任务号
uchar idata task_sp[MAX_TASKS]; //栈指标存放数组
//从指定的任务开始运行任务调度,调用该宏后,将永不返回
#define os_start(tid) {task_id=tid; SP=task_sp[tid]; return;}
void task_switch() //任务切换函数(任务调度器)
{
uchar xdata test_id;
test_id=SP; //堆栈指针
task_id++;
if(task_id==MAX_TASKS)
task_id=0;
SP=task_sp[task_id];
}
void task_load(uint fn, uchar tid)
{
task_stack[tid][0]=(uint)fn&0xFF;
task_stack[tid][1]=(uint)fn>>8;
task_sp[tid]=task_stack[tid]+1;
}
void task1()
{
for(;;)
{
DataPort = 0x55;
task_switch(); //每执行一段时间任务,就释放CPU一下,让别的任务有机会运行
}
}
void task2()
{
while(1)
{
DataPort = 0xaa;
task_switch();
}
}
void task3()
{
while(1)
{
DataPort = 0xff;
task_switch();
}
}
void main()
{
task_load(task1, 0); //将task1函数装入0号槽
task_load(task2, 1);
task_load(task3, 2);
os_start(0); //从0号槽开始运行任务
}
|