0

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;
       }
    }

CPU 将在启动后几秒钟(约 2 秒)锁定自身,然后 LED 停止闪烁,UART 无响应。甚至变量 cts 在开始时也设置为 0(因此无法输入 if())。

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

请,如果我错过了要写在这里的任何重要信息,请告诉我。

4

1 回答 1

1

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

于 2012-12-29T16:16:03.397 回答