口的内存映射 stm32f7_STM32F7高速缓存
STM32F7是第一款帶有內(nèi)部高速緩存的STM32微控制器,所以接下來我們會介紹一些和高速緩存和Cache相關(guān)的基本概念,會介紹一些如果是開發(fā)者在使用STM32F7的時候需要注意的事情。
STM32F7的內(nèi)核中帶有一級高速緩存,實現(xiàn)了4K的數(shù)據(jù)緩存和4K的指令緩存。
下面介紹一下什么是高速緩存和與高速緩存相關(guān)的一些基本概念。
高速緩存就是高速存儲器塊,包括地址信息和相關(guān)聯(lián)的數(shù)據(jù),它的目的主要是為了提高對存儲器的平均訪問速度。
執(zhí)行代碼的時候CPU每次都要去訪問FLASH,而我們知道FLASH的讀取速度是遠遠低于CPU的主頻的,所以需要設(shè)置一個等待周期來保證能夠正確地從FLASH中把數(shù)據(jù)讀出來。有了Cache之后,第一次訪問FLASH讀取出需要的指令和數(shù)據(jù)之后,可以把指令和數(shù)據(jù)先放到Cache里,當下次再需要這部分內(nèi)容的時候就不需要再去訪問FLASH,而是直接從Cache中把這部分內(nèi)容讀出來,這樣就可以提高存儲器的平均訪問速度和程序的執(zhí)行速度。
高速緩存的這種應用是基于下面兩個程序的局部性:
一個是空間局部性,如果一個存儲器的位置被訪問,那么將來它附近的位置也會被訪問,比如順序執(zhí)行代碼或者是使用一個數(shù)據(jù)結(jié)構(gòu)。
另一種是時間局部性,被訪問過一次的存儲器位置,接下來會被多次引用。比如代碼中的循環(huán)。
下面介紹一下高速緩存中的一些術(shù)語。
緩存行是指邏輯上的一組存儲器位置,是內(nèi)存交換數(shù)據(jù)的最小粒度。
緩存命中是指要訪問的數(shù)據(jù)或者指令已經(jīng)在緩存中。
緩存缺失是指要訪問的數(shù)據(jù)或者指令不在緩存中。
處理器需要訪問某個可緩存的寄存器位置時,會先檢查緩存內(nèi)是否已經(jīng)存在該位置的內(nèi)容。如果緩存命中,就直接從緩存讀出;如果緩存缺失,就從存儲器中讀出,同時放入緩存。
緩存分配是指當出現(xiàn)緩存缺失時,需要在緩存中發(fā)現(xiàn)一個位置,并且把新的緩存數(shù)據(jù)存到這個位置。在緩存分配時有兩種策略,一種是讀分配,就是說在進行讀操作發(fā)生緩存缺失的時候,進行緩存分配,所有可緩存的存儲器都是讀分配;另一種是寫分配,是在進行寫操作發(fā)生緩存缺失的時候進行緩存分配。
在應用高速緩存的時候會帶來一致性問題,一個原因是程序員不能控制對存儲器的訪問時機,不知道什么時候會發(fā)生CPU訪問存儲器,可能在讀數(shù)據(jù)寫數(shù)據(jù)的時候都是從緩存中讀從緩存中取和把數(shù)據(jù)寫到緩存中,根本就沒有真正地訪問存儲器,可能在某一個時刻緩存滿了,但又需要存新的緩存內(nèi)容,這個時候可能會把數(shù)據(jù)重新寫到FLASH中,這個時機是程序員不能控制的。另一個問題是同一個數(shù)據(jù)被保存在多個物理位置,被保存在緩存里,又被保存在FLASH中,這兩個物理位置中的數(shù)據(jù)并不都是一致的,所以這個時候就會出現(xiàn)一致性問題。
驅(qū)逐是指從緩存中移除一個緩存行,為新的數(shù)據(jù)騰位置的過程。它發(fā)生在一個標位“dirty”的緩存行被新的緩存行替代的時候,標位“dirty”是說現(xiàn)在數(shù)據(jù)還只是存在緩存里,需要更新到存儲器中。
回寫是指在對數(shù)據(jù)進行操作時,只更新緩存,然后將緩存行標記為“dirty”,當這個緩存行需要被替換的時候,再將數(shù)據(jù)寫到存儲器中。
透寫是指在對數(shù)據(jù)進行操作的時候同時更新緩存和二級存儲,這時候緩存行不被標記為“dirty”。
緩存策略
第一種:透寫,就是說數(shù)據(jù)直接同時寫到緩存和下一級存儲器中。
第二種:回寫,是說數(shù)據(jù)只寫到緩存。
Cortex-M7高速緩存
Cortex-M7的高速緩存采用了哈佛結(jié)構(gòu),指令緩存和數(shù)據(jù)緩存都是分開的,而且是可選的,只在AXIM接口有緩存。對于M7的系統(tǒng)架構(gòu)來說,增加了Cache之后它增加了Cache的維護操作,增加了新的相關(guān)寄存器,最重要的是使用Cache會對系統(tǒng)軟件有影響。
Cortex-M7高速緩存全面支持下列的緩存屬性:
透寫,不支持寫分配;
回寫,不支持寫分配;
回寫,支持寫分配。
回寫的方式有利于優(yōu)化性能,因為減少了對FLASH的訪問次數(shù),但是會帶來一致性的問題,Cortex-M7沒有對一致性的硬件支持,所以需要從軟件的層面去保證數(shù)據(jù)的一致性。
對于一致性有兩種可選方案
一種是把所有的共享存儲器都定義為共享屬性,定義為共享屬性之后這些區(qū)域?qū)⒛J不被緩存到D-Cache,由于所有的操作都是直接針對二級存儲器進行的,性能就會降低。但是因為這種情況下緩存對于這些區(qū)域是透明的,所以寫軟件會更容易。
另一種是通過軟件對cache進行維護,包括兩個方面,一方面M7的寫操作必須是全局可見的,另一方面其他主設(shè)備的寫操作要對M7可見。
存儲器的屬性可以由MPU來進行設(shè)定,包含共享屬性、分配策略和存儲器類型。
下圖是存儲器默認的映射和屬性
最后說一下初始化和使能以及緩存的時候需要注意的問題
上電復位時,在使能之前,cache必須全部被作廢,作廢就是告訴CPU現(xiàn)在緩存中的數(shù)據(jù)已經(jīng)沒有用了,如果想對這些數(shù)據(jù)進行操作的話必須重新從二級存儲中把它讀出來。如果不這樣做,可能會引發(fā)程序不可預測的行為。如果是通過軟復位并且確定復位前RAM中的值都是可靠的,可以不用做這一步。
為了保證數(shù)據(jù)的一致性,必須在除能D-cache之前對其進行清理,這個只在使用回寫策略時需要,如果不這么做就可能會丟失數(shù)據(jù)。
感興趣的朋友可以關(guān)注“AI電堂”公眾號
或者直接登錄電堂網(wǎng)站觀看相關(guān)課程
電堂科技?c.51diantang.com總結(jié)
以上是生活随笔為你收集整理的口的内存映射 stm32f7_STM32F7高速缓存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python安全编码问题_浅谈Pytho
- 下一篇: map中只有一个值 获取_小学数学,为什