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.

EDMA速率问题

Other Parts Discussed in Thread: AM1808

我用的芯片是AM1808,最近采用了EDMA实现了从DDR往EMIF接口传数据。在对EDMA做传输压力测试后发现,EDMA在传92K数据时,速率只能达到2.4MB/s。但传32MB数据时,速率能达到320MB/s。EDMA速率真是这样吗,在传几十K数据的时候速率比较慢?  

  • 我有点怀疑上面得到的结果,因为EMIF的速度最高100MHz, 最高也就100/3 *2byte,DDR往EMIF的瓶颈在EMIF,所以不可能达到320Mbyte/S的.

  •     Tony,你好。后来我又去测了一下,发现是我测试的问题。32MB数据情况下,传输速率大概9.7MB/s。但传输92K时传输速率还是比较低只有2MB/s的样子(我大概需要4MB/s 的速率)。我做了一份试验报告,里面包括了我测试代码、试验硬件环境以及示波器测试结果。Tony你的邮箱是什么?

       对了,有什么EDMA和EMIF的 例子吗?

     

  • 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,自己看一下说明配置吧。

  • 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    怎么把这段高电平的时间再减少。

  • #1. 为什么要用这种2byte一次的传输方式?是应用上有这种特殊要求?这样下来还不如CPU直接读写来的快。因为在不断的切换EDMA的parameter set,这是要时间的,而且总线上不能pipe line起来,完全体现不了EDMA在速度上的优势了。

    #2. 没有办法,如果是ACNT大于2byte,CS之间都不会有高电平。只会在burst size为边界时出现一次CS高电平。

  • Tony,是这样。我这边是把DDR里面一整块数据传到与EMIF口相连的一块芯片里面的一个寄存器。寄存器为16bit,这个寄存器映射到EMIF的一个地址。这就要求在EDMA传输中目标地址不能变,而且一直保持同一个地址。我想问一下能以一次A传输把这么大一块数据传到一个寄存器里面吗。

  • 那边是一个FIFO吧?如果是FIFO就可以啊。目的地址index设为0就可以了。本身不管传多少数,在总线上都是一个一个传输的,你分开传,还是一起传,其实在总线上表现是一样的,只是CS间隔的区别而已。

  • 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启动延时吗

       

  • #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.

  • Tony,看了你推荐的文章。从文章上看overhead是芯片硬件的基本特性,难道 overhead latency 就不能减小了吗?

  • Tony,就是这个Overhead是否还是跟什么因素有关系的,虽然不能抹去这段时间但至少可以减少这段时间?

  • 即然定义为overhead就是没办法减小了。

    对于你目前的测试,并不存在与其它资源的冲突,比如有其它master在访问DDR或EMIF,互相之间不存在资源仲裁导致的延时,所以没有办法减少了。

    所以EDMA用来传大数据效率才高,这样overhead平均到每个数就很少了。

    不过这个速度应该足够你的应用需求了吧。

  • 顺便请你帮个忙,精确量一下这个延时是多长。

    补充一下,这个延时跟内部总线及EDMA模块的频率有关,CPU频率设定后,总线及EDMA的频率也就定了,所以CPU主频跑的越高,这个延时会少一些。这个你也可以帮忙验证一下,将CPU设成不同频率测量一下延时。

  • Tony,你说的两个问题我都会去测一下,但可能需要到下周了。但是有一个问题我需要向你确认一下,就是如何测才是精确的。我这边使用GPIO口和EMIF的cs的电平变化来看这段时间。