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和其他堆栈,并为每个堆栈保留了足够的内存。