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发信号翻转一次,有时候有,有时候没有,不知道是什么原因?