• 正文
  • 相关推荐
申请入驻 产业图谱

基于Cortex®-M7与Cortex®-M85的STM32推测访问:实用指南

11/06 08:47
164
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

摘要

Cortex®-M7 与 Cortex®-M85 的 STM32 没有关闭推测访问的单比特。用 MPU 配成 Device(或 strongly-ordered)与 Execute-never,并先初始化 TCM,挡住非预期访问。

引言

现代处理器常靠推测访问提性能。简单说:CPU 可能还不确定要不要用,就开始读指令或数据。本文说明意法半导体(ST) Cortex®-M7 与 Cortex®-M85 上的推测访问,以及怎么用软件挡住非预期行为。

1. 推测访问行为

Cortex®-M7 与 Cortex®-M85 都实现了推测机制。多数应用里,推测能把内核性能抬上去;但存储器或外设配不好,就会带副作用。

一条关键原则:“系统设计者不得假定推测范围是固定的或已被明确界定。”

基本概念:

  • CPU 试图预测下一步可能需要什么
  • 甚至在指令明确请求之前就可能访问存储器
  • 也可能访问软件并未显式访问的存储器
  • 这些访问并不总意味着 CPU 会使用该数据

可能发生在:指令取指;数据读;Cache linefill;TCM(ITCM/DTCM)访问。

推测访问示例

  • 可对任意 normal、可执行存储器地址发起指令取指
  • 可对任意 normal 类型、读/写或只读地址发起数据读(即使 cache 关闭)
  • 可对任意可缓存地址发起 cache linefill
  • 可在任一 TCM 接口上发起 TCM 读

2. 何时不会发生推测

在 Cortex®-M7 / Cortex®-M85 的 STM32 上,下列情形不会发生推测访问。

  • AXI 上不会对 execute-never 区域做推测指令取指
  • AXI 上不会对不可缓存地址做推测数据 cache linefill
  • 不会对 device 类型地址做推测数据读或推测 cache linefill
  • 不会在外设 AHB 端口上做推测读
  • 不会做推测写

把存储器属性配对,就能减少或挡住非预期行为。

3. 对应用开发者为何重要

在 STM32 上,若推测访问落到还没准备好被提前/意外访问的存储器或外设上,系统行为可能出问题。例如:未初始化 RAM;敏感外设;未开时钟的硬件块;本不该提早访问的区域;等待状态很长的外部存储器。

典型副作用与症状

  • 未初始化存储器接口(TCM SRAM、AXI SRAM,或 ECC 无效的 flash 字)出现偶发 ECC 错误
  • 擦除期间访问 flash,或访问未配置外设时 CPU 可能停顿:例如外部存储器接口(XSPI、FMC 等)在内核时钟关闭(PLL 或 HSE 关闭)时被访问
  • 外部存储器性能损失;典型可见症状之一是 LCD 随机闪烁

Cortex®-M 上没有一键关掉推测访问的位;要靠正确初始化和 MPU 配置来挡住非预期行为。

4. 如何防范推测访问

4.1 TCM 区域与推测

TCM 区域一律按 normal 类型对待,所以始终可能被推测。TCM 内容没初始化时,推测访问可能冒出偶发 ECC 错误。建议在打开 ECC 错误上报前先初始化这些存储器(就算应用没用到)。

4.2 其他存储器区域与推测

4.2.1 防范 CPU 推测

对未映射到 TCM、又不该被推测访问的 AXIM 映射区域,Arm 建议用 MPU 配成 Device(或可用时的 strongly-ordered),并标成 execute-never。这是护住特殊区域的常用做法。

4.2.2 保护读敏感器件:正确使用 MPU 属性

标为 noncacheable/normal 的区域不得用于访问读敏感外设(如 LCD、FPGA,以及 FMC/XSPI 等外部存储器接口上的 FIFO)。若发起 load 的指令被打断,对这些区域的读事务可能被重复;对重复读有副作用的外设会导致错误行为。

警告: noncacheable normal 也不应用于写敏感外设(写也可能被重复)。

5. STM32CubeMX 默认 MPU 配置

5.1 用 STM32CubeMX 配置 Cortex®-M7

对带 Cortex®-M7 的产品(如 STM32H7xx 或 STM32F7xx),CubeMX 会建议配置 MPU,以防对未初始化外部存储器的推测访问。若选择 Yes,会在 main.c 生成 MPU_Config(),实质为背景 MPU 配置,要点包括:

  • Enable;Region NUMBER0;BaseAddress 0x0;Size 4GB
  • SubRegionDisable = 0x87(排除内部存储器地址空间)
  • AccessPermission = NO_ACCESS;DisableExec = 禁止取指
  • 属性设为 strongly-ordered(TEX level0、shareable、not cacheable、not bufferable)

Cortex®-M7 默认属性中,“External RAM”(0x6000 0000 – 0x9FFF FFFF)关键:默认 normal 且可执行(XN=N),即使未接外部存储器也可能被推测读。背景 region 0 将该范围相关子区域改为 strongly-order 以防推测。

SubRegionDisable 表示:对应位为 1 的子区域不应用当前 MPU 设置。整 4 GB 分为 8 个 512 MB 子区域;0x87 = 0b1000 0111 选中覆盖外部存储器接口(FMC、QSPI、OSPI 等)的子区域。若应用需要使用外部存储器,须另配新 MPU 区域(从 region 1 起),允许访问所需地址范围。

5.2 用 STM32CubeMX2 配置 Cortex®-M85

Cortex®-M85 的 MPU 基于 PMSAv8,区域不可重叠(不能像 M7 那样定义背景区域),但起止更灵活。详见 Armv8-M Memory Model and Memory Protection User Guide。

STM32CubeMX2 将外部存储器属性配为 Device-nGnRnE(Device,无 Gathering、无 Reordering、无 Early write acknowledgment),等价于 M7 上的 strongly-ordered;使用 attribute index 0。生成 mx_cortex_mpu_init(),例如:

HAL_CORTEX_MPU_SetDeviceMemAttr(HAL_CORTEX_MPU_MEM_ATTR_0,
HAL_CORTEX_MPU_DEVICE_MEM_NGNRNE);

典型外部存储器保护区域配置示例:

p_region_config.base_addr = 0x60000000;
p_region_config.limit_addr = 0x9FFFFFFF;
p_region_config.access_attr = HAL_CORTEX_MPU_REGION_ALL_RW;
p_region_config.exec_attr = HAL_CORTEX_MPU_EXECUTION_ATTR_DISABLE;
p_region_config.priv_exec_attr = HAL_CORTEX_MPU_PRIV_EXECUTION_ATTR_DISABLE;
p_region_config.attr_idx = HAL_CORTEX_MPU_MEM_ATTR_0;
HAL_CORTEX_MPU_SetConfigRegion(HAL_CORTEX_MPU_REGION_0, &p_region_config);
HAL_CORTEX_MPU_EnableRegion(HAL_CORTEX_MPU_REGION_0);

Region 0 对 0x60000000–0x9FFFFFFF 允许读写、禁止执行,并应用 attr0 的 Device-nGnRnE。若需把外部存储器用于代码执行或常规数据,须调整基址/上限;对未使用部分可能还需额外 MPU 区域。

6. 小结与要点

做应用存储器保护时,要认清:推测行为跟架构走,可能超出软件预期。区域没被显式保护前,别假设“一定没副作用”。

下面这些区域要主动用 MPU 管起来:外部存储器;外部外设;未用或尚未初始化的区域。

需特别注意:地址空闲已映射但未激活(外设内核时钟关闭);存在读副作用的区域;ECC 初始化不完整。

压低推测副作用的关键做法:用 MPU 把敏感区域标成 Device(或可用时的 strongly-ordered) 与 Execute-never;读/写敏感外设不要用 noncacheable/normal。

来源:https://community.st.com/stm32-mcus-60/speculative-access-on-cortex-m7-and-cortex-m85-based-stm32-a-practical-guide-165275 参数以意法半导体官方最新资料为准。

意法半导体

意法半导体

意法半导体拥有49,000名半导体技术的创造者和创新者,掌握半导体供应链和先进的制造设备。作为一家半导体垂直整合制造商(IDM),意法半导体与二十多万家客户、成千上万名合作伙伴一起研发产品和解决方案,共同构建生态系统,帮助他们更好地应对各种挑战和新机遇,满足世界对可持续发展的更高需求。意法半导体的技术让人们的出行更智能,让电源和能源管理更高效,让云连接的自主化设备应用更广泛。我们正按计划在所有直接和间接排放(包括范围1和范围2)、产品运输、商务旅行以及员工通勤排放(重点关注的范围3)方面实现碳中和,并在2027年底前实现100%使用可再生电力的目标。 详情请浏览意法半导体公司网站:www.st.com.cn

意法半导体拥有49,000名半导体技术的创造者和创新者,掌握半导体供应链和先进的制造设备。作为一家半导体垂直整合制造商(IDM),意法半导体与二十多万家客户、成千上万名合作伙伴一起研发产品和解决方案,共同构建生态系统,帮助他们更好地应对各种挑战和新机遇,满足世界对可持续发展的更高需求。意法半导体的技术让人们的出行更智能,让电源和能源管理更高效,让云连接的自主化设备应用更广泛。我们正按计划在所有直接和间接排放(包括范围1和范围2)、产品运输、商务旅行以及员工通勤排放(重点关注的范围3)方面实现碳中和,并在2027年底前实现100%使用可再生电力的目标。 详情请浏览意法半导体公司网站:www.st.com.cn收起

查看更多

相关推荐

意法半导体拥有49,000名半导体技术的创造者和创新者,掌握半导体供应链和先进的制造设备。作为一 家半导体垂直整合制造商(IDM),意法半导体与二十多万家客户、成千上万名合作伙伴一起研发产品和 解决方案,共同构建生态系统,帮助他们更好地应对各种挑战和新机遇,满足世界对可持续发展的更高需 求。意法半导体的技术让人们的出行更智能,让电源和能源管理更高效,让云连接的自主化设备应用更广 泛。我们正按计划在所有直接和间接排放(包括范围1和范围2)、产品运输、商务旅行以及员工通勤排 放(重点关注的范围3)方面实现碳中和,并在2027年底前实现100%使用可再生电力的目标。 详情请浏 览意法半导体公司网站:www.st.com.cn