本帖最后由 刘前辈 于 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;
- }
- }
、、
|