This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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);
}

}

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

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

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

    #3. 加的不对的结果就是程序返回不对,导致跑飞。
  • 您好,我没有用dsp的bios. dsp是裸机跑,通过代码来注册自己的中断服务//edma3 ccint0 中断映射和使能
    IntRegister(5, EDMA3CCComplIsr);
    IntEventMap(5, SYS_INT_EDMA3_0_CC0_INT1);
    IntEnable(5); 那么 EDMA3CCComplIsr这个自己写的函数定义前用加interrupt关键字吗
  • 裸机代码需要加Interrupt关键字。

    代码跑飞的话,建议加大heap, stack试试。
  • 好的,我试下