TI论坛
直播中

王晶

7年用户 148经验值
私信 关注

请问如何解决link 模式的EDMA读写错误,64个dma link到一起读写错误的问题?

本帖最后由 一只耳朵怪 于 2018-6-19 15:01 编辑

测试代码见附件,麻烦下载后帮忙测试一次,看看是什么问题。
测试目的:
实现64个EDMA 通过LINK方式对一段数据进行读写,每个EDMA传输数据大小4096Byte,总计传输1MB数据
测试变量:
#define   N          65536
#define  DST_ADDR1  (0x80000000)
float  srcBuff1[4*N]
float  srcBuff2[4*N]
函数说明:
函数1:
Int32 qdma_link_xfer_region (Int32 instNum, Uint8 channelNum, Int32 regionNum)
功能:把srcBuff1中的数据写到DDR3中
函数2:
Int32 qdma_link_xfer_region_read (Int32 instNum, Uint8 channelNum, Int32 regionNum)
功能:把DDR3中数据读到srcBuff2中
测试步骤:
步骤1:初试化srcBuff1 和srcBuff2,srcBuff1赋值为0到4*N-1;srcBuff2赋值为8192;
步骤2:同过LINK方式的EDMA,调用函数qdma_link_xfer_region()把srcBuff1写到以DST_ADDR1为起始地址的DDR3中,
步骤3:通过LINK方式的EDMA,调用函数qdma_link_xfer_region_read()从以DST_ADDR1为起始地址的DDR3中读取上步写入的数据存到srcBuff2中
步骤4:通过对比srcBuff1 和srcBuff2的值,计数srcBuff1 与srcBuff2不相等的个数, (正常情况下,srcBuff1与srcBuff2的数据应该完全相等,计数应该为零)
测试结果与存在的问题:
1.通过对比分析步骤2,把srcBuff1写到DDR3 中写数据正确;
2. 实际测试发现: srcBuff2中最后4096个结果与srcBuff1中对应位置的数据不同,导出数据通过分析发现srcBuff2中的最后一部分数据在EDMA操作前后没变化?
3.  出现错误后,点击Debug 重新加载程序,然后再次运行,运行结果正确,但是再次运行错误再次出现,也就是说只有Debug后的第一运行结果正确,循环
问题猜想:
  • 从测试结果推测,感觉64个EDMA中的最后一个EDMA没有传输完成就结束了,只传输一部分数据,请问是不是不是LINK模式的配置的不对?
  • 一个EMMA通道能把64个EDMA   link到一起吗?
具体现象如下图所示:第2幅图是第1幅图的局部放大结果,图像的最右侧部分srcBuff1srcBuff2不相等

回帖(2)

王晶

2018-6-19 02:21:15
经过分析,初步认定是L1 cache的的问题,在Memory browser 中勾选L1cache与不勾选L1CACHE两种情况下 MCSM中的数据不同,请问该如何修改保证程序的正确性?
举报

杨娟

2018-6-19 02:29:17
引用: HenryRain 发表于 2018-6-19 02:21
经过分析,初步认定是L1 cache的的问题,在Memory browser 中勾选L1cache与不勾选L1CACHE两种情况下 MCSM中的数据不同,请问该如何修改保证程序的正确性?

在向源地址写数据后需要刷cache即cache writeback,启动EDMA之前需要对目的地址invalid cache,可以调用csl中的相应函数执行cache的writeback及invalid。如果L2配置了cache,则对DDR需要刷L2 cache,如果只有L1D cache,则刷L1D cache。
                                                                          

举报

更多回帖

×
20
完善资料,
赚取积分