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)发送一些字符,系统会立即再次锁定。 -_-!什么错了?
如果我遗漏了任何重要信息,请告诉我。
答案 0 :(得分:1)
也许一个堆栈溢出并破坏另一个堆栈。检查您是否正确初始化了FIQ,IRQ和其他堆栈,并为每个堆栈保留了足够的内存。