TI中文支持网
TI专业的中文技术问题搜集分享网站

OMAPL138 EDMA3中断服务程序

你好,我现在遇到一个问题,就是我在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);
}

}

Shine:

加interrupt关键字与不加的区别是函数的返回方式不一样。

#1. 用DSP BIOS的dispatcher才不用写interrupt关键字,不用dispatcher,还是要写interrupt关键字的。因为中断ISR的返回指令不一样,是B IRP,也就是从中断ISR返回时用的记录返回指针的寄存器不一样。这个你可以通过编译产生的汇编代码确认一下的。

#2. 如果不dispatcher,则首先是进入dispatcher函数,它是一个加了interrupt关键字的ISR,自己的ISR只是它调用一个普通函数,所以不用interrupt关键字。

#3. 加的不对的结果就是程序返回不对,导致跑飞。

user5219479:

回复 Shine:

您好,我没有用dsp的bios.dsp是裸机跑,通过代码来注册自己的中断服务//edma3 ccint0 中断映射和使能
IntRegister(5, EDMA3CCComplIsr);IntEventMap(5, SYS_INT_EDMA3_0_CC0_INT1);IntEnable(5); 那么 EDMA3CCComplIsr这个自己写的函数定义前用加interrupt关键字吗

Shine:

回复 user5219479:

裸机代码需要加Interrupt关键字。

代码跑飞的话,建议加大heap, stack试试。

user5219479:

回复 Shine:

好的,我试下

赞(0)
未经允许不得转载:TI中文支持网 » OMAPL138 EDMA3中断服务程序
分享到: 更多 (0)