我对STM32H7 MPU的一些属性感到困惑。
我已经阅读了一些文档:STM32H7参考和编程手册,STMicro在MPM上的应用说明等
我已经理解了可共享性和不可缓存性(至少在单核STM32H7上是这样)。这是正确的吗?
我需要为QSPI闪存定义一个MPU区域。MicroChip的一份文件(参考TB3179)指出,QSPI存储器应配置为强有序存储器。我真的不明白为什么?
问题:我已经明白可共享与不可缓存是完全等价的(至少在单核STM32H7上是这样)。这是正确的吗?
以下是MPU配置的ST指南:
https://www.st.com/content/st_com/en/support/learning/stm32-education/stm32-moocs/STM32_MPU_tips.html
如果某个区域是可缓存和可共享的,则在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:在没有显式配置的情况下,Usage Fault默认调用HardFault处理程序。区分错误处理需要在SCB系统处理程序控制和状态寄存器中启用首先:
SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk // will also be set by HAL_MPU_Enable()
| SCB_SHCSR_BUSFAULTENA_Msk
| SCB_SHCSR_USGFAULTENA_Msk;
UsageFault处理程序可以评估中所述的Usage Fault状态寄存器(UFSR)https://www.keil.com/appnotes/files/apnt209.pdf.
printf("UFSR : 0x%4xn", (SCB->CFSR >> 16) & 0xFFFF);