簡體   English   中英

STM32H7 MPU 可共享 memory 屬性和強排序 memory 類型

[英]STM32H7 MPU shareable memory attribute and strongly ordered memory type

我對 STM32H7 MPU 的一些屬性感到困惑。

我已經閱讀了幾篇文檔:STM32H7 參考和編程手冊、STMicro 關於 MPM 的應用筆記等……

我知道可共享完全等同於不可緩存(至少在單核 STM32H7 上)。 這是對的嗎?

我需要為 QSPI Flash memory 定義一個 MPU 區域。 MicroChip 的一份文檔(參考 TB3179)表明 QSPI memory 應配置為強排序。 我真的不明白為什么?

問:我知道可共享完全等同於不可緩存(至少在單核 STM32H7 上)。 這是對的嗎?

這是 MPU 配置的 ST 指南:

https://www.st.com/content/st_com/en/support/learning/stm32-education/stm32-moocs/STM32_MPU_tips.html

如果某些區域是Cacheable 和Shareable ,則在 STM32F7/H7 中僅使用指令緩存

由於 STM32 [F7 和 H7] 微控制器不包含任何用於保持數據一致性的硬件功能,將區域設置為可共享意味着該區域不使用數據緩存 如果區域不可共享,可以使用數據緩存,但是總線主控之間的數據一致性需要通過軟件來保證。

當 INSTRUCTION_ACCESS_DISABLED(從不執行,禁用代碼執行)時,STM32H7 上的可共享似乎隱含地與非緩存訪問同義

此外,

https://community.arm.com/developer/ip-products/processors/f/cortex-a-forum/5468/shareability-memory-attribute

共享性屬性告訴處理器它必須做任何必要的事情來允許共享數據。 這真正意味着什么取決於特定處理器的功能。

在具有多 CPU 硬件緩存一致性的處理器上; 可共享性屬性是參與高速緩存一致性邏輯的信號。 例如,如果通過一致的互連連接,A57 可以在集群內和集群之間保持可共享數據的緩存一致性。

在沒有硬件緩存一致性的處理器(例如 Cortex-A8)上,共享數據的唯一方法是如您所料將其推出緩存。 在 A8上,可共享、可緩存的 memory 最終被視為未緩存。

有人,如果我錯了,請糾正我——很難就這個話題做出明確而簡潔的陳述。


問:我需要為 QSPI Flash memory 定義一個 MPU 區域。 QSPI memory 應配置為強排序。 我真的不明白為什么?

上面的 MPU 指南至少聲明了兩點:防止推測性訪問和防止寫入被碎片化(例如被讀取操作中斷)。

當在 SDRAM 或 Quad-SPI 等外部存儲器上執行時,推測性 memory 讀取可能會導致高延遲甚至系統錯誤。

外部存儲器甚至不需要連接到微控制器,但其 memory 范圍可通過推測讀取訪問,因為默認情況下,其 memory 區域設置為正常。

決不會對強有序和設備 memory 區域進行推測性訪問。

強有序 memory 類型用於需要每次寫入為單個事務的存儲器

對於強有序 memory 區域CPU 等待 memory 訪問指令結束

最后,我懷疑 alignment 可能是 memory 方面的要求,它由強制對齊讀/寫訪問的 memory 類型充分表示。

https://developer.arm.com/documentation/ddi0489/d/memory-system/axim-interface/memory-system-implications-for-axi-accesses

但是,設備和強排序 memory 始終是不可緩存的。 此外,對設備或強排序 memory 的任何未對齊訪問都會生成 alignment UsageFault ,因此不會導致任何 AXI 傳輸。 這意味着本章中給出的訪問示例從不顯示對設備或強排序 memory 的未對齊訪問。


UsageFault:沒有顯式配置,UsageFault 默認調用 HardFault 處理程序。 首先需要在SCB System Handler Control 和 State 寄存器中啟用差異化錯誤處理:

SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk // will also be set by HAL_MPU_Enable()
    | SCB_SHCSR_BUSFAULTENA_Msk
    | SCB_SHCSR_USGFAULTENA_Msk;

UsageFault 處理程序可以評估https://www.keil.com/appnotes/files/apnt209.pdf中描述的 UsageFault 狀態寄存器 (UFSR)。

printf("UFSR : 0x%4x\n", (SCB->CFSR >> 16) & 0xFFFF);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM