STM32H7——高速緩存Cache(二)【含代碼】

上一講我們說了cache的一些基本原理,這一講我們來說說H7的cache配置所有資料點擊這里領(lǐng)取哈

STM32H7—高速緩存Cache(一)

Cortex-M7內(nèi)核的L1 Cache由多行內(nèi)存區(qū)組成,我們的H7是分為 16Kbytes 的 I-Cache 和 D-Cache
每行有32字節(jié),每行都配有一個地址標(biāo)簽。數(shù)據(jù)緩沖DCache是每4行為一組,稱為4-way set associative。而指令緩沖區(qū)ICache是2行為一組,2-way set 這樣節(jié)省地址標(biāo)簽,不用每個行都標(biāo)記一個地址

  • 以16 KBytes 的 D-Cache 來計算,一共128 個組(sets), 512 個緩沖行(lines),每個緩沖行 32 個字節(jié)

首先來看下H7的默認(rèn)內(nèi)存地址映射范圍:

其中,WT 表示 Write-through(透寫),WB 表示 Write-back(回寫),WA 表示 Write-allocate(寫分配),沒有明確標(biāo)注 WA 的就是 RA(讀分配)。XN 的意思是 Execute-Never, 其含義為如果相應(yīng)的地址空間是 XN,是絕不允許執(zhí)行代碼的。

存儲器類型為 Normal 的才能使用 cache,并且 TCM 接口是 not cacheable 的。

在H7中 Cache 的配置是通過 MPU 來設(shè)置的,通常只用到下幾種方式。

Cache 相關(guān)操作的函數(shù)在 cmsis/include/core_cm7.h 頭文件中聲明從函數(shù)名中可以知道,包括四種 cache 操作:enable、disable、clean 和 invalidate。

當(dāng)然還有三個不常用的函數(shù):

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);

下面我們來看一下這些函數(shù)。

SCB_EnableICache() 

使能指令I(lǐng)-Cache,系統(tǒng)上電后優(yōu)先初始化即可

SCB_DisableICache() 

禁止指令I(lǐng)-Cache。

SCB_InvalidateICache()

使 I-cache 無效,無效化Invalid是將Cache Line標(biāo)記為無效,即刪除操作。

SCB_EnableDCache()

此函數(shù)使能數(shù)據(jù)D-Cache,系統(tǒng)上電后優(yōu)先初始化即可

SCB_DisableDCache()

禁止數(shù)據(jù)D-Cache。

SCB_InvalidateDCache()

使 D-Cache 無效,無效化Invalid是將Cache Line標(biāo)記為無效,即刪除操作。

SCB_CleanDCache()

Clean 清空所有的 cache-line,即將 dirty 的 cache-line 全部寫到 cache line 對應(yīng)的真實的物理地址中

所謂的 drity 屬性,即寫操作時, 更新了相應(yīng)的 cache-line,但是沒有更新到真實的物理地址,而這個 clean 的動作, 就是將 cache 中的內(nèi)容更新到真實的物理地址中。

SCB_CleanInvalidateDCache()

此函數(shù)是前面兩個函數(shù)SCB_InvalidateDCache和SCB_CleanDCache的二合一。將Cache Line中標(biāo)記為dirty的數(shù)據(jù)寫入到相應(yīng)的存儲區(qū)后,再將Cache Line標(biāo)記為無效,表示刪除。這樣Cache空間就都騰出來了,可以加載新的數(shù)據(jù)。

SCB_InvalidateDCache_by_Addr()

根據(jù)地址信息無效其對應(yīng)的 cache-line。

SCB_CleanDCache_by_Addr()

根據(jù)地址信息 clean 其對應(yīng)的 cache-line。

SCB_CleanInvalidateDCache_by_Addr()

根據(jù)地址信息 clean 并 invalidate 其對應(yīng)的 cache-line。

一共就這么多,大部分都是對D-Cache的操作,正常使用的時候,直接調(diào)用函數(shù)進(jìn)行初始化就行

 SCB_EnableICache();//使能I-Cache SCB_EnableDCache();//使能D-Cache 

但是,在STM32H7—高速緩存Cache(一) 中我們提到了Cache的一致性問題,比方說DMA操作等引起的一致性錯誤等

1.CPU寫數(shù)據(jù)到內(nèi)存

當(dāng)CPU有寫物理內(nèi)存的指令時,CPU 會先去更新相應(yīng)的 cache-line(Write-back 策略)緩存,在沒有 clean 的情況下,會導(dǎo)致其對應(yīng)的實際物理內(nèi)存中的數(shù)據(jù)并沒有被更新,如果這個時候有其它的 Host(如 DMA)訪問這段內(nèi)存時,就會出現(xiàn)問題(由于實際物理內(nèi)存并未被更新,和 D-cache 中的不一致),這就是所謂的 cache 一致性的問題。

完整資料可進(jìn)群免費領(lǐng)取!!!

嵌入式物聯(lián)網(wǎng)的學(xué)習(xí)之路非常漫長,不少人因為學(xué)習(xí)路線不對或者學(xué)習(xí)內(nèi)容不夠?qū)I(yè)而錯失高薪offer。不過別擔(dān)心,我為大家整理了一份150多G的學(xué)習(xí)資源,基本上涵蓋了嵌入式物聯(lián)網(wǎng)學(xué)習(xí)的所有內(nèi)容。點擊下方鏈接,0元領(lǐng)取學(xué)習(xí)資源,讓你的學(xué)習(xí)之路更加順暢!記得點贊、關(guān)注、收藏、轉(zhuǎn)發(fā)哦!

點擊這里找小助理0元領(lǐng)取

the end

評論(0)