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.

C6657 接受FPGA的 doorbell中断, 在doorbell 中断处理函数中置标志位;之后再main 中while(1)检测,时间400多ms

各位大牛你们好, 我已经实现dsp向FPGA写数据和读数据的功能。

写数据流程:DSP-NWRIRE包

读数据流程:DSP-READ包->FPGA->NWRIRE->Doorbell包 ,然后在收到doorbell后,置全局标志位。在main中的while检测标志位后取数 ,现在都实现了, 但是在调试发现, 从FPGA读时,先是dsp发NREAD包,FPGA收到后,迅速从单口ram中读数据,再给dsp发NWRIE包,发完后 再发doorbell,dsp收到doorbell,进入中断,但问题是从中断入口出来,到main中while检测标志事件大概400ms , 这个时间也太长了,根本不能作为DSP主动从FPGA读数据接口。 我想知道这个时间为啥这么长?

我做了如下尝试:

             1.怀疑其他中断影响,在出中断后,又进入其他中断。但工程里再也没有他中断
    
              2.用CCS的 clock功能,第1个断点在发送NREAD包函数处打断点,第2个断点在main中while检测置位后,再打断点,单步调试中,发现还是400ms。

              但是第1个断点在中断打,发现单步执行,竟然10us;这2中操作差距怎么这么大?我也用TSCH,TSCL计数器测得结果一样,也是400ms

            3.我猜测出中断,检测标志位费好长时间,我将标志位定义成 volatile变量,但是结果一样

我的问题如下:

          1.我本想发送NREAD后,FPGA回NWIRE,doorbell;当收到doorbell后取数,立马用当次数,达到数据同步,是否这种方法不行? 论坛看了好多,

          都是FPGA主动上传大批量数后,再发doorbell,没我这么用的。哪有什么更好方法从FPGA获取数据吗?

           2.从收到doorbell,到main中while检测标志位,为啥这么长时间?

           3.是否跟cmd文件有关,是否需要优化程序?

  • 请问中断里有没有用printf打印信息?
  • 没有啊! 只是读取中断标志位,和清标志位, 还有全局一个变量++ ;

    如下:
    interrupt void SRIO_Doorbell_ISR()
    {
    Uint32 doorbell;
    doorbell= gpSRIO_regs->DOORBELL_ICSR_ICCR[0].RIO_DOORBELL_ICSR; //read doorbell. this test only use doorbell reg 0

    if(1==doorbell)
    {
    DoorbellFlg = 1;
    }
    gpSRIO_regs->DOORBELL_ICSR_ICCR[0].RIO_DOORBELL_ICCR= doorbell; //clear doorbell interrupt

    Doorbell_ISRnum++;
    }
  • 我有做了如下实验还是不行

    1. DoorbellFlg 前加 volatile 关键词, 结果还是一样

    2.我将全局DoorbellFlg 定义 数据段 , 映射指定内存空间 ,但还是不行啊

    #include "MemoryMapInit.h"
    #include "Keystone_common.h"

    #pragma DATA_SECTION(DoorbellFlg,".Flag");
    volatile far Uint8 DoorbellFlg = 0;


    cmd文件如下:
    .Flag > SL2
  • 自己先顶一下
x 出现错误。请重试或与管理员联系。