FIQ& IRQ混合使用导致内核冻结,为什么?

时间:2012-12-28 23:46:50

标签: embedded arm irq

3个中断使能,1个UART到IRQ(串行端口),Timer1到IRQ(用于控制闪烁的LED),以及Timer0到FIQ(用于产生输出步进信号)。

第一个FIQ处理程序为空:

void FIQ_HANDLER(void) __fiq
{
   if(FIQSTA & TIMER0)
   {
        T0CLR = 0;
        break;
   }
}

IRQ处理程序:

void IRQ_HANDLER(void) __irq
{
   if(IRQSTA & TIMER1)
   {
        T1CLR = 0;
        MAKE_LED_FLASH();
        break;
   }
   if(IRQSTA & UART)
   {
        BLAH_BLAH_BLAH();
        break;
   }
}

上面的代码工作正常,LED闪烁,UART响应和其他功能。但是在我向FIQ处理程序添加了一些代码之后,主要是设置一个计数器(uint16)并让IO变为高/低:

void FIQ_HANDLER(void) __fiq
    {
       if(FIQSTA & TIMER0)
       {
            if(cts>0)
            {
                IO_BLAH_BLAH_BLAH();
                cts--;
            }
            T0CLR = 0;
            break;
       }
    }
启动后几秒钟(~2秒)CPU将自行锁定,然后led停止闪烁,UART没有响应。甚至变量cts在开始时设置为0(因此无法输入if())。

我首先想到的可能是因为timer0设置得太快(因此更多FIQ堆叠在一起而更少清除)。所以我将timer0设置为较低频率。并且......好吧,启动时好像是OKAY,LED一直闪烁......但如果我通过串口(UART)发送一些字符,系统会立即再次锁定。 -_-!什么错了?

如果我遗漏了任何重要信息,请告诉我。

1 个答案:

答案 0 :(得分:1)

也许一个堆栈溢出并破坏另一个堆栈。检查您是否正确初始化了FIQ,IRQ和其他堆栈,并为每个堆栈保留了足够的内存。