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.

c6455的edma数据传输



调试dsp与fpga的通信时,fpga的ram满512bits时fpga给dsp一个中断,通知dsp读取其数据,其中dsp是在中断函数中通过edma完成数据的读取的。问题是在调试的时候我在主函数的死循环中加了printf语句,这个个时候两者间的通信正常。但是当我去掉printf语句后,dsp只能响应一定次数的中断(即dsp只能读取fpga一定次数的数据),这个时候dsp的程序就跑飞了,停止运行,请问这是怎么回事?

本人刚开始学dsp,没找到原因,希望能得到帮助!谢谢

  • 这个感觉跟printf函数关系不大, 一般倒是加了printf函数会出错的多.  

    试试把EDMA数据读取放在DSP中断函数之外, 这样可以加速DSP对下次FPGA中断的响应.

    另外, 你用BIOS了么?

  • 我把edma数据读取放在了DSP中断函数外,但是还是出现同样的结果。我没有对BIOS进行过设置。我把我的工程放在上面,如果你有时间可以帮我看一下吗?

    另外我在运行的时候,问题最开始时是当中断响应一定次数后,错误先处在edma上:

        status = CSL_edma3HwChannelControl(hChannel,CSL_EDMA3_CMD_CHANNEL_SET,NULL);
        if (status != CSL_SOK) {
            printf("Edma channel set command is failed\n");
            return;
        }
       
        regionIntr.region = CSL_EDMA3_REGION_5;
        regionIntr.intr = 0;
        regionIntr.intrh = 0;
       
        do {
            /* Poll on interrupt bit 0 */
            CSL_edma3GetHwStatus(hModule,CSL_EDMA3_QUERY_INTRPEND,&regionIntr);
        } while (!(regionIntr.intr & 0x1));

    先是停留在红色的地方,等待edma的中断响应位,等待一段时间后,程序指针就跳到这一段汇编中

    B0000028 028C3626            LDB.D1T2      *A3++[1],B5
    B000002C 7877                SUB.D2        B0,1,B0
    B000002E 012B         [ B0]  BNOP.S2       0xB0000028 (PC+8 = 0xb0000028),0
    B0000030 1EBB         [!B0]  BNOP.S2       0xB0000014 (PC-12 = 0xb0000014),0
    B0000032 04A6                MVK.L1        0,A1
    B0000034 308C69F0     [!B0]  AND.D1        3,A3,A1
    B0000038 02903636            STB.D1T2      B5,*A4++[1]
    B000003C E3208000            .fphead       n, l, W, BU, br, nosat, 0011001
    B0000040 328F89F0     [!B0]  AND.D1        -4,A3,A5

    现在不知道该怎样解决,希望你能帮帮我,非常感谢!

    EDMA_FPGA.zip
  • IPR没能置位, EDMA transfer completion一直完成不了 , 像是EMIF口down掉了, 导致EDMA数据传输不能完成, 因为你能收到一定次数的中断响应, 所以感觉像是FPGA RAM不稳.

    为了排除是不是FPGA造成的, 可以先试试DSP内部循环搬移数据块是否也会搬几次后有问题?

  • 你好,现在我调试发现当没有printf语句时,函数每调用一次,我的堆栈一直向上累加,一直到堆栈溢出。当加上printf()语句时,函数每运行一次堆栈不会向上累加,堆栈就不会溢出,程序能正常运行。我不知道这是怎么回事?该怎么处理?c语言怎么进行出栈操作呢?

  • 把interrupt void HANDLE_INTR4(void);  关键字interrupt去掉试试.

  • 可以了,非常感谢。就是把interrupt去掉就可以了。但是我还是有点疑问,难道在写dsp的c程序时,中断函数前面不能加interrupt关键字吗?

  • CSL库函数 CSL_intcHookIsr中已经用了interrupt来定义ISR, 所以就不能再用interrupt关键字来重复定义.