本帖最后由 刘前辈 于 2011-11-10 19:41 编辑
#71楼highgear
农民工的意思大概是想利用中断来切换任务,但有几个问题:51的中断如果没有 reti 则不会再次响应;
即便调用一次 reti 开放中断, 因为任务的死循环,堆栈最终会溢出。
.
.
堆栈溢出是菜鸟编程结果。看咱从来不溢出。
.
#include <reg51.h>
#include <ABSACC.H>
bit LED = 0;
unsigned char TaskID = 0;
unsigned char TimerCount = 0;
void Task1();
void Task2();
code void (code *pTask[2])()={Task1,Task2};
void Timer0Init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
}
void TaskSwitch()
{
TaskID = (TaskID + 1);
if(2 == TaskID) TaskID = 0;
//(*pTask[TaskID])();
}
void Task1()
{
while(1)
{
P1 = 0X0F;
}
}
void Task2()
{
while(1)
{
P1 = 0XF0;
}
}
void main()
{
Timer0Init();
//pTask[0] = Task1;
//pTask[1] = Task2;
(*pTask[0])();
}
void t0_BH(void)
{
TR0=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
//TF0 = 0;
TR0=1;
TimerCount ++ ;
if(TimerCount >= 10) /* 1s任务调度一次 */
{
LED = 1;
TimerCount = 0;
TaskSwitch();
}
}
void t0(void) interrupt 1 using 1
{
t0_BH();
if(LED)
{
LED=0;
//TaskID = (TaskID + 1)%2;
T0_ISR.temp=pTask[TaskID];
SP-=5; // 指向栈底
DBYTE[SP]=T0_ISR.tmp[1];
SP++;
DBYTE[SP]=T0_ISR.tmp[0]; //高地址在栈顶
SP+=4;
}
}
最简单调度器.rar
(16.17 KB)
、、 |