|
/****小小調(diào)度器開始**********************************************/
#define MAXTASKS 3
unsigned char currid;
unsigned char timers[MAXTASKS];
#define _SS static unsigned char lc=0; switch(lc){ case 0:
#define _EE ;}; lc=0;
#define WaitX(tickets) {lc=__LINE__; timers[currid]=tickets;} return ; case __LINE__:
#define RunTask(TaskName,TaskID) {currid=TaskID; if (timers[TaskID]==0){timers[TaskID]=255; TaskName();}}
#define CallSub(SubTaskName) WaitX(0); SubTaskName(); if (timers[currid]!=255) return;
/*****小小調(diào)度器結(jié)束*******************************************************/
sbit LED1 = P2^1;
sbit LED2 = P2^2;
void InitT0()
{
TMOD = 0x21;
IE |= 0x82; // 12t
TL0=0Xff;
TH0=0XDB;//22M---b7;
TR0 = 1;
}
void INTT0(void) interrupt 1 using 1
{
unsigned char i;
TL0=0Xff; //10ms 重裝
TH0=0XDB;//b7;
for (i=0;i<MAXTASKS;i++){
if ((timers[i]!=0)&&(timers[i]!=255)) {
timers[i]--;
}
}
}
void task1(){
_SS
while(1){
WaitX(50);
LED1=!LED1;
}
_EE
}
void task2(){
_SS
while(1){
WaitX(100);
LED2=!LED2;
}
_EE
}
void main()
{
InitT0();
while(1){
RunTask(task1,1);
RunTask(task2,2);
}
}
|
|