DMA使用注意事项

1、DMA造成脏数据
在使用DMA进行数据搬运时,当需要中途停止DMA的传输,需要先停止控制器的dma请求,再强制关闭DMA,最后再释放内存,否则有可能造成DMA搬运数据到释放过的内存中。
2、省电对DMA的影响

在使用DMA将数据从ram搬运到fifo后,释放省电锁之前,需要特别注意,不能仅仅依赖于DMA的完成中断,DMA的完成中断只表示DMA已经将所有数据都搬运进外设的fifo,不代码外设已经完成fifo中数据的传输。
必须添加FIFO是否有数据的判断,否则进省电后会导致fifo中未传输完成的数据丢失。

3、Cache对DMA的影响

在mem-->dev传输之前,需要先clean cache,保证cache中的数据到真正的RAM中后,再启动DMA;
在dev-->mem传输之后,需要invalid cache,保证每次读数据会重新从RAM中去取数据。(注意:A9处理器,invalidate操作仅会无效掉当前cache line,不会有其他操作;A53处理器,32位或者64位模式下,invalidate的cacheline如果是dirty的,cache在进行invalidate前会自动增加clean操作。)
DMA使用需要考虑cache一致性,而在cache一致性操作时,有可能将别人的空间误踩,所以在申请DMA空间时,需要注意地址和大小要进行cache line对齐。

4、MMU对DMA的影响

MMU完成虚拟地址和物理地址的映射,虚拟地址对CPU可见,对DMA不可见;物理地址对CPU不可见,对DMA可见。
1、配置DMA传输地址时,需要注意将物理地址转换为虚拟地址;
Linux上kmalloc出来的地址物理连续,地址转换后可给DMA使用,vmalloc出来的地址物理不连续,即使转换也不能给DMA使用。

猜你喜欢

转载自blog.51cto.com/13824435/2135392