STM32F7系列芯片集成了L1高速緩存,即L1 CACHE,包括D-CACHE和I-CACHE。它能夠提升CPU訪問(wèn)數(shù)據(jù)或指令的速度,改善MCU的性能。關(guān)于STM32F7 L1 CACHE的應(yīng)用,有個(gè)數(shù)據(jù)一致性問(wèn)題需要注意,不然編程時(shí)可能會(huì)遇到些奇怪的現(xiàn)象。 在聊這個(gè)話題之前,先說(shuō)幾個(gè)基本概念或術(shù)語(yǔ)。 1、芯片復(fù)位后,I-CACHE,D-CACHE默認(rèn)是關(guān)閉的。可以分別打開或關(guān)閉以及配置各自大小。 2、對(duì)于STM32F7來(lái)說(shuō),只有經(jīng)過(guò)AXI總線接口訪問(wèn)時(shí)才用到L1 CACHE。換句話,通過(guò)其它總線【TCM/AHBP/AHBS】做數(shù)據(jù)或指令訪問(wèn)時(shí)是不涉及到L1 CACHE的。 3、回寫【WRITE BACK】:在寫數(shù)據(jù)時(shí),只是把數(shù)據(jù)寫進(jìn)D-CACHE而未寫入二級(jí)存儲(chǔ)器,并將緩存行里的數(shù)據(jù)標(biāo)識(shí)為DIRTY,直到執(zhí)行CACHE的清除操作才將D-CACHE里的內(nèi)容寫進(jìn)二級(jí)存儲(chǔ)器。 3、透寫【WRITE THROUGH】:在寫數(shù)據(jù)操作時(shí)同時(shí)將數(shù)據(jù)寫入D-CACHE和二級(jí)存儲(chǔ)器。這對(duì)于保持?jǐn)?shù)據(jù)的一致性有好處,代碼編寫也相對(duì)簡(jiǎn)單。不過(guò)它需要消耗更多的寫數(shù)據(jù)時(shí)間。當(dāng)然,下次訪問(wèn)相同內(nèi)容時(shí)還是可以直接從緩存里讀取。跟回寫相比,算是一種折衷處理辦法。 4、STM32F7片內(nèi)外各個(gè)存儲(chǔ)單元的存儲(chǔ)屬性是通過(guò)MPU來(lái)配置的。在芯片復(fù)位之后,MPU是默認(rèn)關(guān)閉的,此時(shí)各存儲(chǔ)單元的存儲(chǔ)屬性遵照如下的默認(rèn)配置。 
好,那什么時(shí)候會(huì)發(fā)生數(shù)據(jù)一致性問(wèn)題? 當(dāng)有CPU和其它主設(shè)備【如DMA】共同訪問(wèn)某可緩存的二級(jí)存儲(chǔ)器比方SRAM1,同時(shí)該存儲(chǔ)器又具有回寫屬性,此時(shí)就可能發(fā)生數(shù)據(jù)一致性問(wèn)題。因?yàn)樵摯鎯?chǔ)器的回寫屬性,導(dǎo)致通過(guò)CPU欲寫入存儲(chǔ)器的數(shù)據(jù)只是緩沖在CACHE里,而沒有及時(shí)寫入存儲(chǔ)器。如果此時(shí)DMA訪問(wèn)該二級(jí)存儲(chǔ)器的話,讀到的數(shù)據(jù)可能跟預(yù)期不一致。 為了避免數(shù)據(jù)不一致的問(wèn)題,我們需要做D-CACHE維護(hù)操作。一般有如下四種方法: 1、當(dāng)對(duì)一個(gè)可緩存的二級(jí)存儲(chǔ)器做了寫數(shù)據(jù)操作之后,通過(guò)軟件對(duì)D-CACHE進(jìn)行清除操作,即運(yùn)行SCB_CleanDCache()。這樣將CACHE里的緩存內(nèi)容寫回到二級(jí)存儲(chǔ)器,比如把那些DIRTY CACHE行的數(shù)據(jù)寫進(jìn)SRAM1。 2、通過(guò)MPU調(diào)整可緩存存儲(chǔ)器的存儲(chǔ)屬性,將其CACHE使用方式改為透寫模式。這樣保證每次寫入CACHE里的內(nèi)容也同時(shí)寫入二級(jí)存儲(chǔ)器,比如寫進(jìn)SRAM1。 3、通過(guò)MPU調(diào)整可緩存存儲(chǔ)器的存儲(chǔ)屬性,將其共享屬性改為可共享的【SHAREABLE】。此后該二級(jí)存儲(chǔ)器將變?yōu)椴豢删彺妗?/span> 4、通過(guò)配置CACR寄存器中的D-CACHE位,強(qiáng)制將所有寫操作配置為透寫屬性。
當(dāng)然,跟上面描述相對(duì)應(yīng)的還有一種情形。那就是DMA更新了可緩存存儲(chǔ)器比如SRAM1的數(shù)據(jù)后,CPU再去讀SRAM1,此時(shí)也會(huì)發(fā)生數(shù)據(jù)不一致的問(wèn)題。因?yàn)镃PU此時(shí)讀的數(shù)據(jù)還是之前CACHE里的舊數(shù)據(jù)。為了避免這個(gè)問(wèn)題,保證數(shù)據(jù)的一致,就得在CPU讀SRAM1之前通過(guò)軟件執(zhí)行CACHE失效操作,這樣保證CPU直接從二級(jí)存儲(chǔ)器比方SRAM1讀取數(shù)據(jù)。 下面有個(gè)關(guān)于數(shù)據(jù)一致性的實(shí)例供大家思考。 首先CPU從片上FLASH存儲(chǔ)塊aSRC_Const_Buffer的128字節(jié)常量數(shù)據(jù)拷貝到SRAM1里的一個(gè)名為pBuffer的緩存區(qū)。 然后CPU配置并使能DMA執(zhí)行從內(nèi)存到內(nèi)存的傳輸,將SRAM1里pBuffer緩存區(qū)的數(shù)據(jù)傳輸?shù)紻TCM RAM的另一個(gè)aDST_Buffer緩存區(qū)。 最后,CPU將aDST_Buffer緩存區(qū)的數(shù)據(jù)與flash存儲(chǔ)塊aSRC_Const_Buffer的常量數(shù)據(jù)進(jìn)行比較是否一致。 
最后小結(jié)下,對(duì)于STM32F7系列MCU來(lái)說(shuō),可能發(fā)生數(shù)據(jù)一致性問(wèn)題需要的幾個(gè)因素: 1、有CPU和DMA參與數(shù)據(jù)訪問(wèn); 2、有被CPU和DMA共同訪問(wèn)的可緩存的帶回寫屬性的物理存儲(chǔ)塊; 3、開啟了D-CACHE;
往期話題鏈接:STM32CUBE相關(guān)技術(shù)手冊(cè)哪里找:http://www.torrancerestoration.com/bbs/dpj-50088-1.html |