背景:FPGA控制四路ADC采集数据(16bit),采样率128k,数据经过FPGA时加入高16位的标识符标记其来源,32位的数据通过UPP传输给DSP,此时DSP的UPP内置DMA设置为8bit接收模式(I通道),upp外部时钟为12MHz,将L1、L2、DDR2都设置为缓存,缓存窗buffer设置为1280byte × 6行,line_offset为1280byte
问题:
根据DSP计算结果来看,参与DSP计算的数据严重滞后于ADC采集到的数据。(如定位时,目标耗时3s从12点钟方向移动到1点钟方向,DSP结果的变化趋势与目标一致,但是该趋势耗费的时间可能为1min),觉得应该是缓存的数据更新没跟上,怎么才能保证DSP每次参与计算的数据都是最新的呢?(每个循环都启动DMA传输)
user4511301将L1、L2、DDR2都设置为缓存
你的意思是说将DDR设为可被Cache吧。
我觉得可能是没做Cache一致操作造成的。
建议:
#1. 为了验证我的猜测,将buffer改到SHARERAM,即0x8000 0000开始的那一块128KB的空间,或者在L2上留出一块做RAM,将uPP的buffer放在上面。再看计算结果如何。
#2. 如果按#1没问题了,那么就是Cache的一致性维护问题,在每次计算完,做一次Cache invalid操作。
http://processors.wiki.ti.com/index.php/Main_Page
Think Over Before Asking.
http://www.catb.org/~esr/faqs/smart-questions.html#goal
回复 Tony Tang:
回复 Shine Zhang:
回复 user4511301:
首贴中的Cache invalid的位置不是太合理吧。直接放在upp transfer后,我不知道upp transfer函数里是否有等待传输完成。可以的话,把你的数据,及处理流程描述一下。
为什么不能用ping pong buffer, UPP是很容易做ping pong buffer操作的啊。
数据就是(每次FPGA通过UPP发送1280*6*32bit,upp传输完成后,cache invalid,进行下一步解算,uart传给上位机),不断循环括号内的流程。我们想upp传输完成后,在进行解算的这段时间内,让dsp忽略掉fpga过来的数据。因为看到在接收模式下I/Q通道可以输出一个WAIT来忽略掉传输过来的数据,尝试利用CHA(接收模式)的WAIT给fpga一个信号,fpga收到该信号后停止发送,但是发现相应的管脚没有WAIT输出。