使用定时器中断进行任务切换,每个任务按时间片(本测试不同任务相同时间片)运行,非死循环型任务。
Code#include#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; }



