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



3中断使能,1 UART到IRQ(串口),Timer1到IRQ(控制闪烁LED), Timer0到FIQ(产生输出步进信号)。

第一个FIQ处理器为空:

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

硬中断请求优先级别处理程序:

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将在启动后几秒钟(~2sec)锁定自己,然后led停止闪烁,UART不响应。甚至变量cts在开始时也被设置为0(因此不能输入if())。

我首先认为这可能是因为timer0设置太快(以便更多的fiq堆叠在一起,更少被清除)。所以我把timer0设置为不那么频繁。和. .好的,启动时似乎没问题,LED一直闪烁…但是如果我通过串行端口(UART)发送一些字符,系统立即再次锁定。_ - !怎么了?

如果我遗漏了什么重要的信息,请告诉我。

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

最新更新