【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
不管是soc,还是mcu、fpga,大部分系统都是采用master-slave的模式进行cpu数据处理的。这种模式虽然看上去比较简单,但是有一个致命的问题,那就是所有数据的搬运都是需要cpu来处理的。大部分时候,这种方式都是比较低效的。

1、dma就是外设搬运的高手
所谓的dma,就是让dma负责ddr、外设之间进行数据通信。这种通信,可以是外设数据搬到ddr,也可以是ddr搬到外设,两者都是可以的。
2、dma也接受cpu的控制
dma虽然可以控制其他slave设备,但是本质上来说,它自身也是一种slave设备。既然是一种slave设备,那么dma不可避免受到cpu的控制。从另外一个角度说,我们也可以通过slave接口对dma进行设置。比如说,设置源地址、设置目的地址、设置长度,等到一切都准备ok之后,就是提醒dma开始工作。而一切都结束之后,dma就会发一个中断给cpu,这就是dma处理的完整过程。
3、dma和cache一致性
dma使用过程中最大的问题,就是dma和cache一致性的冲突。比如说,假设我们需要处理一段外设数据。传统的方法,就是通知dma及时把外设数据copy到内存。拷贝过程如果顺利的话,整体处理其实非常快,但是如果此时直接用cpu处理ddr中的外设数据,就会出现cache一致性的错误。
之所以错误,是因为原来cpu访问数据的时候,会优先从dcache查看一下,当前地址的数据在cache中有没有缓存。如果缓存存在,那么就直接从cache中读取数据。反之,再从ddr中获取数据。本来这是非常常见的操作,但是由于dma的存在,cpu在处理数据的时候,有可能dcache命中,读到的数据还是老数据,这就非常麻烦了。
遇到这一问题的话,一般会invalid掉指定地址所有的cache数据,这样cpu再次处理数据的时候,就会默认从ddr中重新加载,通过这种方式可以完美解决cache一致性的问题。
4、zynq中hp0就是为dma准备的
zynq当中有fpga,有arm,学习上面有一定的难度。哪怕是fpga、arm都ok,这个时候如何配置框图,也是一门学问,其中zynq dma,或者是zynq vdma则是最难处理的地方。而所谓的dma,有一个接口其实就是hp0,所有的dma都是通过hp0**、hp1等接口来直接访问ddr内存数据的。**

5、用好dma很重要
不管是soc,还是mcu、fpga当中,dma出现的场景非常多。所以如果遇到批量数据处理,尤其是视频数据、ad/da数据需要处理的时候,可以优先考虑使用dma,常常会有非常好的效果。