DMA使用注意事项

  

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

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

3,缓存对DMA的影响

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

4, MMU对DMA的影响

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

DMA使用注意事项