繁体   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