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.

srio中NWRITE_R与CPU同时操作内存的冲突问题



6678、FPGA,程序基于STK例程修改。

流程:FPGA通过srio传输数据后,将传输完成标志置1。该传输完成标志位于DSP的SL2中。DSP查询该标志的状态。如果为1,则去读取数据。读取数据后,将该标志清0。

问题现象:连续发送大量数据时(每隔1ms发送一次,每次64K,发送100000次),发送到90000次左右,DSP就会死机。这个时候FPGA仍在继续发送数据

排查:基本定位是DSP将标志位清0,这个动作有影响。推测有可能是DSP在清0的同时,FPGA要将其置1,这个时候发生了冲突。

但是不理解的是:

1、FPGA置1,使用的是带响应的写NWRITE_R。FPGA端能继续发送,说明一直能收到正常响应,那这个响应应该就代表已经写入内存中了吧?

2、在例程中,在操作SL2的优先级上,srioRegs->RIO_PER_SET_CNTL中的cba_trans_pri 为100,MDMAARBX中的优先级设置默认为0。这表明CPU是高于SRIO的。既然有这个仲裁机制,应该就不会出现这个问题了吧?

3、还是说NWRITE_R的响应只是代表到达了SRIO外设,并不代表已经成功写入内存了?即便使用NWRITE_R,是否也并不能保证写冲突的问题?

谢谢!

  • 我觉得会不会与DSP CACHE有关?可以先把DSP L1D CACHE关掉试试。

  • 谢谢!L1D和DDR的cache都已经关掉了的。

    增加了一个握手机制,目前看不会死机。但是会出现fifo地址变化的问题。

    流程:用了两个core,core0查询到有效标志后,将数据存到fifo里,core1从fifo里读取数据,并回写。fifo定义在了SL2中,起始地址是0x0c10_0000。在cmd中分配了空间,操作中也做了cache的维护,程序放在了L2中

    现象:运行一段时间后,发现core1无法从fifo中取数。后来发现,在core1的expression窗口里看,fifo的地址是对的。而在core0的expression窗口里看,fifo的地址已经变了。每次出问题的时候变化的地址也不固定,有时看到的起始地址是0x0c10_0080,有时候是另外一个地址。目前看到的变化后的地址也是在给fifo的空间里。

  • 已解决:对于标志位的操作,增加了握手机制;fifo地址变化是因为有个数组溢出了。