我用的芯片是AM1808,最近采用了EDMA实现了从DDR往EMIF接口传数据。在对EDMA做传输压力测试后发现,EDMA在传92K数据时,速率只能达到2.4MB/s。但传32MB数据时,速率能达到320MB/s。EDMA速率真是这样吗,在传几十K数据的时候速率比较慢?
Tony Tang:
我有点怀疑上面得到的结果,因为EMIF的速度最高100MHz, 最高也就100/3 *2byte,DDR往EMIF的瓶颈在EMIF,所以不可能达到320Mbyte/S的.
Yingjie Shen:
回复 Tony Tang:
Tony,你好。后来我又去测了一下,发现是我测试的问题。32MB数据情况下,传输速率大概9.7MB/s。但传输92K时传输速率还是比较低只有2MB/s的样子(我大概需要4MB/s 的速率)。我做了一份试验报告,里面包括了我测试代码、试验硬件环境以及示波器测试结果。Tony你的邮箱是什么?
对了,有什么EDMA和EMIF的 例子吗?
Tony Tang:
回复 Yingjie Shen:
92K的块也不少了,怎么也比EDMA的最小可配burst size大多了,所以其实际传输速度是一样的,区别在于额外的开销也是一样的,所以计算下来的平均速度就下来的。这个额外开销指的是软件的干预:配置EDMA参数等。
EMIFA的速度取决于3点:
#1. 时序参数的配置:CEnCFG,里的读写setup, strobe, hold,这几个参数要根据其外接的芯片的电气时序要求计算配置,做为简单测试,都设为0试一下,即每个阶段一个cycle(100MHz EMIFA时钟下,即为10ns,一般也够了),保险的做法,还是对照一下外接设备的手册.
#2. EMIFA接口时钟:PLL0_SYSCLK3,或者PLL0 Multiplier Out。
#3. 既然用到EDMA,则还跟EDMA burst size有点关系:CFGCHIP0/1
再有跟DDR相关的就只一个寄存器:PBBPR,自己看一下说明配置吧。
Yingjie Shen:
回复 Tony Tang:
Tony,我去设置了一下EMIF口setup、strobe、hold这几个参数,确实从CS波形上看速率变快了(CS有效时间变短,大概10ns左右),第三个建议无有效作用。但我发现每次EMIF操作之间的时间还是有点长。这里我需要说一下我的EDMA操作是每一次传2个byte的字节给EMIF16位数据总线,然后以链式传输实现92K数据的传输。下面图一是对EMIF的setup等三个参数没有进行修改EMIF的CS的时序情况,图二是对EMIF的setup等三个参数进行修改后EMIF的CS情况。
图一:时间轴坐标为每个放个250ns
图2 时间轴横坐标为250ns
从图一上看CS低电平之间的高电平持续时间为500ns左右,从图二看cs低电平之间的高电平持续时间为300ns左右。
问题:
1、cs低电平之间的高电平主要是EDMA链式传输所需要的时间吗。
2 怎么把这段高电平的时间再减少。
Tony Tang:
回复 Yingjie Shen:
#1. 为什么要用这种2byte一次的传输方式?是应用上有这种特殊要求?这样下来还不如CPU直接读写来的快。因为在不断的切换EDMA的parameter set,这是要时间的,而且总线上不能pipe line起来,完全体现不了EDMA在速度上的优势了。
#2. 没有办法,如果是ACNT大于2byte,CS之间都不会有高电平。只会在burst size为边界时出现一次CS高电平。
Yingjie Shen:
回复 Tony Tang:
Tony,是这样。我这边是把DDR里面一整块数据传到与EMIF口相连的一块芯片里面的一个寄存器。寄存器为16bit,这个寄存器映射到EMIF的一个地址。这就要求在EDMA传输中目标地址不能变,而且一直保持同一个地址。我想问一下能以一次A传输把这么大一块数据传到一个寄存器里面吗。
Yingjie Shen:
回复 Tony Tang:
Tony,你的上一个回答很好解决了我的问题,太感谢了。另外我这里还有一个问题。
是这样的我发现启动EDMA的过程有点慢。我的代码如下:
(*((volatile unsigned int *)(0x01E26060)))=0x00; // 把一个GPIO口置为低电平
(*((volatile unsigned int *)(0x01C02010))) | =(0x01<<25); // 启动EDMA,EDMA的配置在之前的其他地方已设置完成
另外在EDMA的中断子程序里面把上面拉低的GPIO口拉高为高电平。然后用示波器显示GPIO口和EMIF的CS引脚电平变化情况。试验结果如下(图中黄线是GPIO口电平,青线是CS的情况):
从图中看出GPIO口变为低电平后需要一段比较长的时间CS引脚电平才反应过来。
问题:
1 为什么会产生这种现象,能有什么方法来减小这个时间吗?
2 link的ping-pong传输能克服这种EDMA启动延时吗
Tony Tang:
回复 Yingjie Shen:
#1. 这是EDMA的overhead额外开销,可以看一下EDMA3 Transfer Controller (EDMA3TC)这一节,EDMA在收到触发事件后到发起传输,还有一连串的动作要完成。
下面贴子也是讨论EDMA的overhead的。
http://e2e.ti.com/support/dsp/c6000_multi-core_dsps/f/639/p/442085/1618143?keyMatch=edma%20overhead&tisearch=Search-EN-Everything
#2. 还是会有overhead的。因为EDMA接到触发事件才会将parameter分解为TR命令。所以EDMA对越大的数据传输效率越高。
其实上面你得出的就是这个芯片在这种情况下的EDMA overhead.
Yingjie Shen:
回复 Tony Tang:
Tony,看了你推荐的文章。从文章上看overhead是芯片硬件的基本特性,难道 overhead latency 就不能减小了吗?