Abstract
使用定时器中断进行任务切换,每个任务按时间片(本测试不同任务相同时间片)运行,非死循环型任务。
Code
#include <reg51.h>
#define NULL ((void *)0)
sbit D1=P2^0;
sbit D2=P2^1;
struct TASK
{
signed char id;
void (*taskFunction)(void);
};
unsigned char curTaskID;
struct TASK taskArr[2];
void CreatTask(void(*taskFun)(void))
{
int i;
for (i = 0; i < 2; i ++)
{
if (taskArr[i].id == -1)
{
taskArr[i].id = i;
taskArr[i].taskFunction = taskFun;
break;
}
}
}
void ExecuteTask(unsigned char id)
{
taskArr[id].taskFunction();
}
void PopStack(unsigned char id)
{
//now is blank
}
void PushStack(unsigned char id)
{
//now is blank
}
void Task0(void)
{
D1=~D1;
}
void Task1(void)
{
D2=~D2;
}
void main(void)
{
EA=1; //Enable All Interrupt
ET0=1; //Enable Interrupt timer0
TMOD=0x01; //Set timer0 mode = 2
TH0=(65536-46083)/256; //Set high 8 bits
TL0=(65536-46083)%256; //Set low 8 bits
taskArr[0].id = -1;
taskArr[0].taskFunction = NULL;
taskArr[1].id = -1;
taskArr[1].taskFunction = NULL;
CreatTask(Task0);
CreatTask(Task1);
curTaskID = 0; //Set current task id
TR0=1; //Start timer0
while(1)
{
ExecuteTask(curTaskID);
}
}
void Timer0(void) interrupt 1 using 0
{
//Switch task ID
PopStack(curTaskID); //PopStack of Current Task,The Stack Can be a domain of Current Task better
curTaskID ++;
if (curTaskID == 2)
{
curTaskID = 0;
}
PushStack(curTaskID); //PushStack of New Task,The Stack Can be a domain of New Task better
TH0=(65536-46083)/256;
TL0=(65536-46083)%256;
}