1. NMI例程初始化存在bug。
void InterruptInit(void)
{
// 初始化DSP 中断控制器
IntDSPINTCInit();
// 注册中断服务函数
IntRegister(C674X_MASK_NMI, NMIIsr);
}
上述函数初始化,在目前评估板的操作模式下,即手动按钮实现NMI中断,出问题的可能性很小;
但若在此基础上,中断是外部周期的产生,此时出问题可能性极大,分析如下:
1.1 初始化DSP 中断控制器后,NMI中断被初始化为IntDefaultHandler(),此函数定义如下:
static voidIntDefaultHandler (void)
{
while(1);
}
1.2 因外部是周期的产生NMI中断的,假若在“ 初始化DSP 中断控制器”后,在“注册中断服务函数”之前,发生了NMI中断,程序就会一直执行上述IntDefaultHandler()函数,即一直不停地循环,不会继续完成“注册中断服务函数”
2. 为解决此问题,优化中断初始化如下:
void IntRegister (unsigned int cpuINT, void (*userISR)(void))
{
unsigned int step = 0;
/*Set ISRs to default "do-nothing" routine */
while(step !=C674X_INT_COUNT)
c674xISRtbl[step++] = IntDefaultHandler;
/*Set interrupt service table pointer to the vector table */
#ifdef __TI_EABI__
ISTP = (unsigned int)_intcVectorTable;
#else
ISTP = (unsigned int)intcVectorTable;
#endif
/***********************************************************************************/
/*Check the CPU maskable interrupt number */
ASSERT(((cpuINT >= 1) && (cpuINT <= 15)));
/*Assign the user's ISR to the CPU maskable interrupt */
c674xISRtbl[cpuINT] = userISR;
/***********************************************************************************/
/*Clear pending CPU maskable interrupts (if any) */
ICR = 0xFFF0;
/*Enable NMIE bit to allow CPU maskable interrupts */
IER = (1 << C674X_NMI);
}
可存在问题如下:
2.1 与评估板的NMI产生不一样的是,评估板通过手按键产生NMI中断;我这边是FPGA一直不停地以1ms周期发生中断;也就是说,如果按照NMI例程不做修改,很有可能在dsp未初始化完成时,NMI中断就产生了,导致程序一直不停的执行IntDefaultHandler().
2.2 现在程序已经能正常运行了,可中断不是很稳定,每进一次中断,用GPIO发信号翻转一次,有时候有,有时候没有,不知道是什么原因?