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,是否也并不能保证写冲突的问题?
谢谢!
Denny%20Yang99373:
我觉得会不会与DSP CACHE有关?可以先把DSP L1D CACHE关掉试试。
Stephen chen:
回复 Denny%20Yang99373:
谢谢!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的空间里。
TI中文支持网