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使用。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。