STM32H7——高速緩存Cache(二)【含代碼】
上一講我們說了cache的一些基本原理,這一講我們來說說H7的cache配置所有資料點擊這里領取哈
STM32H7—高速緩存Cache(一)
Cortex-M7內核的L1 Cache由多行內存區組成,我們的H7是分為 16Kbytes 的 I-Cache 和 D-Cache
每行有32字節,每行都配有一個地址標簽。數據緩沖DCache是每4行為一組,稱為4-way set associative。而指令緩沖區ICache是2行為一組,2-way set 這樣節省地址標簽,不用每個行都標記一個地址
- 以16 KBytes 的 D-Cache 來計算,一共128 個組(sets), 512 個緩沖行(lines),每個緩沖行 32 個字節
首先來看下H7的默認內存地址映射范圍:
其中,WT 表示 Write-through(透寫),WB 表示 Write-back(回寫),WA 表示 Write-allocate(寫分配),沒有明確標注 WA 的就是 RA(讀分配)。XN 的意思是 Execute-Never, 其含義為如果相應的地址空間是 XN,是絕不允許執行代碼的。
存儲器類型為 Normal 的才能使用 cache,并且 TCM 接口是 not cacheable 的。
在H7中 Cache 的配置是通過 MPU 來設置的,通常只用到下幾種方式。
Cache 相關操作的函數在 cmsis/include/core_cm7.h 頭文件中聲明從函數名中可以知道,包括四種 cache 操作:enable、disable、clean 和 invalidate。
當然還有三個不常用的函數:
void SCB_InvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize); void SCB_CleanDCache_by_Addr(uint32_t *addr, int32_t dsize); void SCB_CleanInvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);
下面我們來看一下這些函數。
SCB_EnableICache()
使能指令I-Cache,系統上電后優先初始化即可
SCB_DisableICache()
禁止指令I-Cache。
SCB_InvalidateICache()
使 I-cache 無效,無效化Invalid是將Cache Line標記為無效,即刪除操作。
SCB_EnableDCache()
此函數使能數據D-Cache,系統上電后優先初始化即可
SCB_DisableDCache()
禁止數據D-Cache。
SCB_InvalidateDCache()
使 D-Cache 無效,無效化Invalid是將Cache Line標記為無效,即刪除操作。
SCB_CleanDCache()
Clean 清空所有的 cache-line,即將 dirty 的 cache-line 全部寫到 cache line 對應的真實的物理地址中
所謂的 drity 屬性,即寫操作時, 更新了相應的 cache-line,但是沒有更新到真實的物理地址,而這個 clean 的動作, 就是將 cache 中的內容更新到真實的物理地址中。
SCB_CleanInvalidateDCache()
此函數是前面兩個函數SCB_InvalidateDCache和SCB_CleanDCache的二合一。將Cache Line中標記為dirty的數據寫入到相應的存儲區后,再將Cache Line標記為無效,表示刪除。這樣Cache空間就都騰出來了,可以加載新的數據。
SCB_InvalidateDCache_by_Addr()
根據地址信息無效其對應的 cache-line。
SCB_CleanDCache_by_Addr()
根據地址信息 clean 其對應的 cache-line。
SCB_CleanInvalidateDCache_by_Addr()
根據地址信息 clean 并 invalidate 其對應的 cache-line。
一共就這么多,大部分都是對D-Cache的操作,正常使用的時候,直接調用函數進行初始化就行
SCB_EnableICache();//使能I-Cache SCB_EnableDCache();//使能D-Cache
但是,在STM32H7—高速緩存Cache(一) 中我們提到了Cache的一致性問題,比方說DMA操作等引起的一致性錯誤等
1.CPU寫數據到內存
當CPU有寫物理內存的指令時,CPU 會先去更新相應的 cache-line(Write-back 策略)緩存,在沒有 clean 的情況下,會導致其對應的實際物理內存中的數據并沒有被更新,如果這個時候有其它的 Host(如 DMA)訪問這段內存時,就會出現問題(由于實際物理內存并未被更新,和 D-cache 中的不一致),這就是所謂的 cache 一致性的問題。
完整資料可進群免費領取!!!
嵌入式物聯網的學習之路非常漫長,不少人因為學習路線不對或者學習內容不夠專業而錯失高薪offer。不過別擔心,我為大家整理了一份150多G的學習資源,基本上涵蓋了嵌入式物聯網學習的所有內容。點擊下方鏈接,0元領取學習資源,讓你的學習之路更加順暢!記得點贊、關注、收藏、轉發哦!
- 贊