DMA(Direct Memory Access)是DSP中至关重要的一个部分,DMA可以在不需要CPU的干预的情况下,在后台执行数据的高速传输,系统效率的高低很大程度上取决与DMA的使用好坏与否。DM642是目前公司内使用最多的DSP,其运行效率的高低决定着大部分产品的性能。下面就DM642上的DMA性能做一个简单的介绍和分析。
DM642中的DMA称为EDMA(Enhanced Direct Memory Access),其EDMA控制器支持64个相互独立的DMA通道,每个通道都可以接受系统外设事件的触发或者CPU的指令的触发,不同DMA传输之间还可以进行连接,构成各种复杂的DMA操作,在600MHz主频时可以提供2.4GB/秒的数据吞吐量。具备的1维、2维传输模式,非常适合图像的处理。系统结构如图所示:
对于EDMA的结构,可以参考相关的数据手册,这里不做详细的说明,主要侧重DMA效率的优化。
要想用好EDMA,需要很好的理解EDMA的传输过程。EDMA内部划分为4个优先级,分别是Q0(Urgent)、Q1(High)、Q2(Medium)和Q3(Low),顾名思义,从0-3由高至低,4个优先级分别对应4个队列,每个队列可容纳16个传输请求,每个队列都可以被CPU和外设使用,且每个部分占用的队列单元个数可以手动设置。每个队列都是FIFO结构,先提交的传输先执行传输操作,队列后面的操作必须等待前面的操作完成后才能够被执行,但是各个队列之间的传输可以按照优先级并行操作,当某个操作处于阻塞、等待状态时,其它队列中的任务可以得到执行。
从这个基本操作模式可以看出合理的对EDMA资源进行分配很重要,目前DM642系统中的处理如下:
1、 高优先级的队列中执行传输数据少但时间要求最紧迫的任务,比如CACHE操作和CPU访问操作,因为这类操作如果得不到快速的响应,会造成CPU的阻塞,严重影响CPU的性能。
2、 低优先级队列中执行紧迫性不高且数据量大的传输。比如编解码的传输,预览、缩放的传输。因为数据量的传输会很长时间的占用DMA操作和外部总线操作,如果将其放在高优先级队列中,会使那些数据量本来很少的操作因为优先级低而长时间得不到响应,造成浪费。
3、 系统图像输入、图像处理和编解码同样都要求大量的数据传输,对于这些传输的安排,把编解码的优先级放为最低。因为大多数用户追求预览的实时和流畅,而编解码的操作对用户来说不直接可见,我们只要求实时即可,同时图像的输入和处理是编解码的前提,这两部分的操作如果无法按时完成,编解码器的优先级再高也没有意义,同样无法保证实时。
4、 除了软件直接发起的DMA操作之外,还要统计哪些外设需要用到DMA操作。在现有的系统中,这些外设主要包括:McASP,音频输入、输出;VideoPort,视频输入、输出;PCI,和主机的数据交换。这些外设的数据量同样非常大,不可以忽略。
5、 优先级确定之后,还要考虑合理的在各个优先级队列中分配操作,除了最高级别的队列要绝对保证之外,对于其它3个队列,尽量做到均衡的分配任务,避免过多的传输集中在某一个队列之中。
关于DMA传输的发起,有三种模式:
1、 外设通过事件发起。在音视频的输入和输出中,通过软件配置外设和EDMA,之后通过DSP内部的EDMA事件,将外设和EDMA关联起来,外设启动后,通过事件自动触发DMA传输,无需软件干预,在某帧视频或音频传输完成后,通过中断通知。
2、 手动触发模式,在现有系统中,利用CSL库,将常用的EDMA操作做了封装,比如1D->1D,1D->2D,2D->1d,2D->2d的传输,在向DMA提交传输请求之后,等待信号量,发起传输的任务进入挂起状态,等操作完成之后,在DMA中断中,释放信号量,唤醒等待的任务。
3、 QDMA模式。TI提供的系统库中把QDMA封装到了DAT模块中,可以直接使用。QDMA并不是独立的DMA,其数据传输仍然是基于EDMA,只是QDMA操作的效率较普通EDMA高。
模式2和3是软件中主要使用DMA的方式,按照不同的机制,使用的时候需要注意:
在手动触发模式下,依靠任务调度来完成等待传输的过程,每次DMA操作都包含任务的切换,中断的处理,适合做较多数据的传输,同时软件的操作较简单,由操作系统负责调度,不会浪费CPU时间来等待传输的完成。但不适合做数据量小且非常频繁的操作,因为数据量很少时,DMA传输很快,相比之下,任务切换、中断处理的操作就显得有些得不偿失了,在过于频繁的使用时,会对系统效率造成影响。
而QDMA的传输发起和传输等待过程独立执行,其等待完成过程无需任务调度,不需要中断处理,只是简单的采用CPU轮询的方式实现,在数据没有完成的情况下,等待DMA传输完成会极大的浪费CPU资源。因此QDMA的使用适合于对数据的处理时间大于DMA传输时间的场合,QDMA还有一个优势:通过优化DMA队列长度,可以按照流水的方式提交多个请求,在进行数据运算和处理时,可以使用QDMA在后台执行一些复杂的操作。
其它的一些注意事项:
1、 注意数据对齐,包括每次传输数据的长度是否对齐和数据的起始地址是否对齐,按照4对齐和8对齐的传输效率最高,当数据非对齐时,DMA的效率会成倍的下降。
2、 和Cache相关的一些操作,由于EDMA在对L2操作时,可以自动执行CACHE操作,当从L2到外部SDRAM传输时,EDMA会自动将L1内的数据写回到L2;相反,当从外部SDRAM到L2传输时,EDMA也会自动将L1内部的相关部分清除。利用这个特点,有些场合用EDMA比直接操作数据更方便,因为不必操心cache一致的问题。
3、 不是所有的操作都要依赖DMA,比如在DMA已经十分繁忙的情况下,如果传输的数据很少,也可以直接用CPU来访问,或者将两者配合使用来达到最好的效果。