EDMA使用中遇到cache一致性的問題

DMA在嵌入式中很常用,使用中需要控制好cache一致性問題,最近項目出現了搬移數據異常的問題,再次明確了該問題的重要。

本文簡單介紹cache原理、DMA原理、DMA與cache一致性問題、項目中EDMA的使用、遇到的問題和解決方法


1. Cache簡介

Cache,是CPU緩存的簡稱,是位於CPU與內存(Memory)之間的臨時存儲器,與內存相比,它容量小、交換速度、價格昂貴,cache主要是爲了解決CPU運算速度與內存讀寫速度不匹配的問題(CPU運算速度遠遠快於內存讀寫速度),cache中存儲CPU短時間內即將訪問的內容,跟cache相關的一個概念叫命中,即CPU訪問數據或調用代碼時,先從cache中尋找(成功叫命中),失敗後再轉向memory,獲取的同時,也把它拷進Cache。只要Cache的空間與主存空間在一定範圍內保持適當比例的映射關係,Cache的命中率還是相當高的。一般規定Cache與內存的空間比爲4:1000,即128kB Cache可映射32MB內存;256kB Cache可映射64MB內存。在這種情況下。命中率都在90%以上。

感興趣可以深入研究

1)Cache的3種基本結構和詳細原理:全相聯Cache、直接映像Cache、組相聯Cache。

2)CPU和Cache及主存之間讀寫方式:貫穿讀出式(Look Through)、旁路讀出式(Look Aside)、寫穿式(Write Through)、回寫式(Copy Back)

2. DMA簡介

當CPU需要處理大量數據時,爲了防止將CPU的有限資源浪費在數據搬移,用獨立於CPU運行的DMA將數據從片外空間(DDR DRAM)搬進片內空間(L2SRAM),就可避開內存直接從緩存中調用,從而加快讀取速度。

3.DMA和cache一致Edma3_CacheInvalidate性問題

該問題是指:cache中數據與內存中數據的不同步。由於緩存存在於cpu與內存中間,所以任何外設對內存的修改並不能保證cache中也得到同樣的更新,DMA直接操作內存,與cache無關,所以進行DMA搬移和CPU處理數據的時候會出現兩個問題:

    • DMA 從片外讀取數據到片內供CPU使用(DDR->L2)。DMA 將外部數據直接傳到內存中,但cache 中仍然保留的是舊數據,這樣CPU在訪問數據時仍認爲cache即內存數據,直接訪問緩存將得到錯誤的數據。 
    • DMA 將CPU提供的片內數據寫到片外(L2->DDR)。CPU在處理數據時數據會先存放到cache中,此時cache中的數據有可能還沒來得及寫回到內存中的數據。如果這時DMA直接從內存中取出數據傳送到外設,外設將可能得到錯誤的數據。

4.使用中存在的問題

目的是用pingpong將DDR搬入L2,計算後再搬出去,原理如下圖,結果發現DDR Data Out中的數據有部分是錯誤的。

5.如何正確使用

錯誤的原因正是第3條中提出的兩點,爲了正確進行DMA 傳輸,必須進行必要的cache 操作。EDMA3中cache 操作主要分爲 flush(清理)和invalidate (作廢)。

    • Flush用在片內->片外時,DMA傳輸前告訴CPU將cache放入內存,保證DMA傳出的是CPU最新提供的數據;
    • Invalidate用在片外->片內時,CPU計算前告訴CPU直接從內存中獲取數據,保證CPU計算的是最新從DMA傳入的。

在上圖中即在1前使用Flush,告訴CPU計算最新的數據,在4後使用Invalidate,告訴CPU將內存刷新以保證DMA搬移最新的數據。


部分內容轉自:http://blog.csdn.net/michaelcao1980/article/details/19191167

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章