STM32F7系列芯片集成了L1高速緩存,即L1 CACHE,包括D-CACHE和I-CACHE。它可以提高CPU訪問數據或指令的速度,改善MCU的性能。關於STM32F7 L1 CACHE的應用,有個數據一致性問題須要注意,否則編程時可能會遇到些奇怪的現象。編程
在聊這個話題以前,先說幾個基本概念或術語。緩存
1、芯片復位後,I-CACHE,D-CACHE默認是關閉的。能夠分別打開或關閉以及配置各自大小。性能
2、對於STM32F7來講,只有通過AXI總線接口訪問時纔用到L1 CACHE。換句話,經過其它總線【TCM/AHBP/AHBS】作數據或指令訪問時是不涉及到L1 CACHE的。spa
3、回寫【WRITE BACK】:在寫數據時,只是把數據寫進D-CACHE而未寫入二級存儲器,並將緩存行裏的數據標識爲DIRTY,直到執行CACHE的清除操做纔將D-CACHE裏的內容寫進二級存儲器。.net
3、透寫【WRITE THROUGH】:在寫數據操做時同時將數據寫入D-CACHE和二級存儲器。這對於保持數據的一致性有好處,代碼編寫也相對簡單。不過它須要消耗更多的寫數據時間。固然,下次訪問相同內容時仍是能夠直接從緩存裏讀取。跟回寫相比,算是一種折衷處理辦法。blog
4、STM32F7片內外各個存儲單元的存儲屬性是經過MPU來配置的。在芯片復位以後,MPU是默認關閉的,此時各存儲單元的存儲屬性遵守以下的默認配置。接口
好,那何時會發生數據一致性問題?內存
當有CPU和其它主設備【如DMA】共同訪問某可緩存的二級存儲器比方SRAM1,同時該存儲器又具備回寫屬性,此時就可能發生數據一致性問題。由於該存儲器的回寫屬性,致使經過CPU欲寫入存儲器的數據只是緩衝在CACHE裏,而沒有及時寫入存儲器。若是此時DMA訪問該二級存儲器的話,讀到的數據可能跟預期不一致。flash
爲了不數據不一致的問題,咱們須要作D-CACHE維護操做。通常有以下四種方法:軟件
1、當對一個可緩存的二級存儲器作了寫數據操做以後,經過軟件對D-CACHE進行清除操做,即運行SCB_CleanDCache()。這樣將CACHE裏的緩存內容寫回到二級存儲器,好比把那些DIRTY CACHE行的數據寫進SRAM1。
2、經過MPU調整可緩存存儲器的存儲屬性,將其CACHE使用方式改成透寫模式。這樣保證每次寫入CACHE裏的內容也同時寫入二級存儲器,好比寫進SRAM1。
3、經過MPU調整可緩存存儲器的存儲屬性,將其共享屬性改成可共享的【SHAREABLE】。此後該二級存儲器將變爲不可緩存。
4、經過配置CACR寄存器中的D-CACHE位,強制將全部寫操做配置爲透寫屬性。
固然,跟上面描述相對應的還有一種情形。那就是DMA更新了可緩存存儲器好比SRAM1的數據後,CPU再去讀SRAM1,此時也會發生數據不一致的問題。由於CPU此時讀的數據仍是以前CACHE裏的舊數據。爲了不這個問題,保證數據的一致,就得在CPU讀SRAM1以前經過軟件執行CACHE失效操做,這樣保證CPU直接從二級存儲器比方SRAM1讀取數據。
下面有個關於數據一致性的實例供你們思考。
首先CPU從片上FLASH存儲塊aSRC_Const_Buffer的128字節常量數據拷貝到SRAM1裏的一個名爲pBuffer的緩存區。
而後CPU配置並使能DMA執行從內存到內存的傳輸,將SRAM1裏pBuffer緩存區的數據傳輸到DTCM RAM的另外一個aDST_Buffer緩存區。
最後,CPU將aDST_Buffer緩存區的數據與flash存儲塊aSRC_Const_Buffer的常量數據進行比較是否一致。
最後小結下,對於STM32F7系列MCU來講,可能發生數據一致性問題須要的幾個因素:
1、有CPU和DMA參與數據訪問;
2、有被CPU和DMA共同訪問的可緩存的帶回寫屬性的物理存儲塊;
3、開啓了D-CACHE;
https://blog.csdn.net/lu_embedded/article/details/78416041 這篇也講的很透徹,從系統層講的很細