实现这个多任务机制的完整源代码如下:
word idata PC_Value, SP_Value; file://储存中断返回点、SP初值的全局变量
byte idata Ctrl_Code; file://控制任务切换的全局变量,在中断函数里被赋值
void main()
{
Initial(); file://初始化函数,与程序结构无关
SP_Value=SP; file://获取SP的初始值
PC_Value=Get_Next_PC(); file://获取下一条指令的地址
EA=1; file://获取PC、SP初值后再开中断保证稳定性
if(Ctrl_Code!=0)
SP="SP"_Value; file://重置堆栈指针,防止堆栈溢出
switch( Ctrl_Code) file://任务入口地址,即中断的返回点
{
case 1: goto TASK1;
case 2: goto TASK2;
case 3: goto TASK3;
default: break;
}
TASK1: for( ; ; )
{ file://任务1代码 }
TASK2: for( ; ; )
{ file://任务2代码 }
TASK3: for( ; ; )
{ file://任务2代码 }
}
word Get_Next_PC(void) file://获取下一条指令的地址
{
word address;
address=*((unsigned char *)SP); file://PC的高字节
address <<= 8;
address+=*((unsigned char *)(SP-1)); file://PC的低字节
return address+4; file://查看反汇编代码,计算所得
}
void Chuan_Kou_Interrupt(void) interrupt 4 using 0
{
byte a1,a2;
a1=a1*a2;
*((unsigned char *)(SP-5))=PC_Value>>8;
*((unsigned char *)(SP-6))=PC_Value & 0x00ff;
{
file://接收串口代码并根据代码修改Ctrl_Code的值
file://其他操作
}
}
文章评论(0条评论)
登录后参与讨论