原创 Get_Next_PC(

2009-3-12 08:54 2132 6 6 分类: MCU/ 嵌入式
  多任务结构程序流程

    实现这个多任务机制的完整源代码如下:
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条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /2 下一条