Embedded 金融情报室及;IRQ混合使用导致内核冻结,为什么?

Embedded 金融情报室及;IRQ混合使用导致内核冻结,为什么?,embedded,arm,irq,Embedded,Arm,Irq,启用3个中断,1个UART到IRQ(串行端口),定时器1到IRQ(控制闪烁的LED),定时器0到FIQ(生成输出步进信号) 第一个FIQ处理程序为空: void FIQ_HANDLER(void) __fiq { if(FIQSTA & TIMER0) { T0CLR = 0; break; } } IRQ处理程序: void IRQ_HANDLER(void) __irq { if(IRQSTA & TIMER1)

启用3个中断,1个UART到IRQ(串行端口),定时器1到IRQ(控制闪烁的LED),定时器0到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;
       }
    }
CPU将在启动后几秒钟(约2秒)自行锁定,然后led停止闪烁,UART不响应。甚至变量cts在开始时也设置为0(因此if()无法输入)

我最初认为这可能是因为timer0设置得太快(这样更多的FIQ堆积在一起,而被清除的更少)。因此,我将计时器0设置为不太频繁。而且..好的,启动时似乎没问题,LED一直闪烁…但是如果我通过串口(UART)发送一些字符,系统会立即再次被锁定。---!怎么了


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

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

FIQ触发的频率如何?听起来可能只是占用了所有处理器的时间。嗯。。“IO_BLAH_BLAH_BLAH()”函数是否使用R0-R7?我猜实际的FIQ处理程序本身不会,因为“_FIQ”属性向编译器发出信号,只使用R8-R14,但如果该处理程序调用其他任何东西,R0-R7可能会损坏?+1-是的,另一个很好的可能性。到目前为止,我已经设法摆脱了所有汇编程序FIQ处理程序,它们根本不使用堆栈,只使用交换寄存器,但并非总是可能的。谢谢大家。我检查了汇编程序(在IDE中),找到了IRQ内存和代码优化的相关配置。刚刚关闭了所有的内存和代码优化。再也不能百分之百地依赖那些操纵者了。。。。