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ā)哦!
- 贊