Bloath 发表于 2011-12-10 08:53:25

问个IRQ中断嵌套的问题

本帖最后由 Bloath 于 2011-12-10 08:55 编辑

看datasheet中,EINT0的优先级比EINT4的默认要高
我写了两个中断程序,我用按键进行触发,程序如下
EINT0的执行是先让左边两个LED亮,延时一段时间后,只让最左边的亮
EINT4的程序内容跟EINT0相类似,只是LED显示变成了右边

单独测两个中断都没有问题,进行嵌套实验
当我触发了EINT4时,在中间的延时时我触发了EINT0
因为EINT0优先级比较高,所以执行了EINT0的中断程序
但是EINT0执行完后没有继续执行EIN4的内容

示意图如下
触发EINT4
   灭---灭---亮---亮
触发EINT0
   亮---亮---灭---灭
程序中的延时
   亮---灭---灭---灭
(如果返回的话应该还能执行
   灭---灭---灭---亮)

求大神解释

raominping 发表于 2011-12-10 10:32:47

你怎么不把程序贴出来呢???那样好分析。你给个结果不好分析的

Bloath 发表于 2011-12-10 13:13:36

本帖最后由 Bloath 于 2011-12-10 14:46 编辑

void LED(U16 Data)
{
      rGPBDAT = (rGPBDAT & ~(0xf<<5)) | ((~Data & 0xf)<<5);
}
void delay(U16 x)
{
      U16 b;
      while(x--)
      {      for(b=0xffff; b>0; b--);    }
}///////////////////////////////
///   EINT0的中断程序
///////////////////////////////
void __irq INT0()
{
      LED(0x03);
      delay(50);
      LED(0x01);
      rSRCPND |= 0x1;
      rINTPND |= 0x1;
}
///////////////////////////////
///   EINT4的中断程序
///////////////////////////////
void __irq INT4()
{
      LED(0x0C);
      delay(50);
      LED(0x08);
      rEINTPEND |= 0x10;
      rSRCPND |= 0x10;
      rINTPND |= 0x10;
}
///////////////////////////////
///   EINT0和4的IRQ初始化
///////////////////////////////
void INTInit()
{
      rGPFCON |= (0x2<<8)|0x2;      //将GPF的两位IO口设成中断模式
      rEXTINT0 |= (0x2<<16)|2;      //将EINT0和EINT4的触发方式为下降沿
      
      rEINTMASK &= ~(1<<4);         //解除EINT0和EINT4的屏蔽位
      rINTMSK &= ~((1<<4)|1);         //同上
      
      pISR_EINT0 = (U32)INT0;             //将中断地址写给二级向量表
      pISR_EINT4_7 = (U32)INT4;         //同上
}

void Main(void)
{
      
      INTInit();
      rGPBCON = 0x155555;
      while(1)
      {
                LED(0x08);
                delay(70);
                LED(0x04);
                delay(70);
                LED(0x02);
                delay(70);
                LED(0x01);
                delay(70);
      }
      
}

mydream0110 发表于 2012-1-3 08:49:47

正在查中断方面的资料,我也是在中断上遇到问题.
页: [1]
查看完整版本: 问个IRQ中断嵌套的问题