首页 > 解决方案 > STM32H7 MPU 可共享内存属性和强序内存类型

问题描述

我对 STM32H7 MPU 的一些属性感到困惑。

我已经阅读了几篇文档:STM32H7 参考和编程手册、STMicro 关于 MPM 的应用笔记等……

我知道可共享完全等同于不可缓存(至少在单核 STM32H7 上)。这是对的吗 ?

我需要为 QSPI 闪存定义一个 MPU 区域。MicroChip 的一份文档(参考 TB3179)表明 QSPI 存储器应配置为强排序。我真的不明白为什么?

标签: cachingstm32cortex-mmpu

解决方案


问:我知道可共享完全等同于不可缓存(至少在单核 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 上可共享、可缓存的内存最终被视为未缓存。

有人,如果我错了,请纠正我——很难就这个话题做出明确而简洁的陈述。


问:我需要为 QSPI 闪存定义一个 MPU 区域。QSPI 存储器应配置为强排序。我真的不明白为什么?

上面的 MPU 指南至少声明了两点:防止推测性访问和防止写入被碎片化(例如被读取操作中断)。

在 SDRAM 或 Quad-SPI 等外部存储器上执行推测性存储器读取可能会导致高延迟甚至系统错误。

外部存储器甚至不需要连接到微控制器,但它的存储器范围可以通过推测读取访问,因为默认情况下,它的存储器区域设置为正常。

决不会对强有序和设备内存区域进行推测性访问。

强有序内存类型用于需要每次写入都是单个事务的内存

对于强有序内存区域,CPU 等待内存访问指令的结束。

最后,我怀疑对齐可能是内存方面的要求,它由强制对齐读/写访问的内存类型充分表示。

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

但是,设备和强序内存始终是不可缓存的。此外,对设备或强排序内存的任何未对齐访问都会生成对齐 UsageFault,因此不会导致任何 AXI 传输。这意味着本章中给出的访问示例从不显示对设备或强排序内存的未对齐访问。


UsageFault :如果没有显式配置,UsageFault 默认调用 HardFault 处理程序。首先需要在SCB System Handler Control 和 State Register中启用差异化错误处理:

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);

推荐阅读