參考了其他網上的例子,改進一下,完美運行。
現貼出程序如下:
#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號槽開始運行任務
}
|