你好,我现在遇到一个问题,就是我在OMAPL138下写了一个用edma3传输数据的程序,edma3链接并且在中断中完成数据的转移。void EDMA3CCComplIsr()是中断服务程序,在函数里我使用了循环寻找 即对AMR寄存器进行了修改。运行正常,数据达到预期的效果,但我在main函数中有一段循环,也用到了循环寻址,发现这段程序执行过程中,会偶尔出现异常数据,我怀疑是在这段代码执行过程中,来了edma3中断,导致循环寻找的amr寄存器被破坏,中断程序没有将现场保护和恢复,查了资料后,ccs定义中断服务程序时,应该在中断函数前加关键字interrupt ,这样CCS在编译期间会给这段代码添加现场保护和恢复的代码,于是我在EDMA3CCComplIsr函数前加了interrupt关键 : interrupt void EDMA3CCComplIsr() 但加了这个关键字后,程序一运行就跑飞,去掉后就没事,我怀疑是我代码有问题,运行了TI starterware里的edma3代码,也是这个问题。我的开发环境是ccs5.5 后来用了ccs6.2也是这个现象。请问这个是什么原因,怎么解决。
//edma3 ccint0 中断映射和使能
IntRegister(5, EDMA3CCComplIsr);
IntEventMap(5, SYS_INT_EDMA3_0_CC0_INT1);
IntEnable(5);
interrupt void EDMA3CCComplIsr()
{
IntEventClear(SYS_INT_EDMA3_0_CC0_INT1);
if(EDMA3GetIntrStatus(SOC_EDMA30CC_0_REGS) & (1 << EDMA3_CHA_MCASP0_RX) )
{
EDMA3ClrIntr(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX);
//McASPRxDMAComplHandler();
}
if(EDMA3GetIntrStatus(SOC_EDMA30CC_0_REGS) & (1 << EDMA3_CHA_MCASP0_TX) )
{
EDMA3ClrIntr(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_TX);
}
}