日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

口的内存映射 stm32f7_STM32F7高速缓存

發(fā)布時間:2025/3/19 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 口的内存映射 stm32f7_STM32F7高速缓存 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。