1. 程式人生 > >EDMA使用中遇到cache一致性的問題

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搬移最新的資料。