【问题标题】:About STM32 ARM Cortex M LDRB instruction关于STM32 ARM Cortex M LDRB指令
【发布时间】:2019-11-13 03:32:48
【问题描述】:

我试图了解当 STM32H7 (Cortex M7) 执行 LDRB 指令时数据总线上的物理情况(为了简化,假设缓存被禁用)。是否有 32 位访问内存并且 4 个字节中有 3 个被丢弃?这取决于内存的类型吗?如果代码在连续地址上执行四个 LDRB,它与执行单个 32 位 LDR 相比(在周期数方面)如何?

【问题讨论】:

  • STM32 涵盖了许多不同的 ARM 微架构。另外,我认为 ARM 至少没有为一些微架构发布周期时间表。
  • 我会精确版本。
  • 阅读 amda/axi/ahb 总线上的 arm 文档。进行单字节写入将是浪费的,因此通常执行总线宽度。您的答案中有 50% 是特定于芯片供应商的,因为它们与 arm 总线接口。由于除了以总线宽度为单位之外,您无法判断读取的大小,因此他们无法使其成为部分总线传输。有例外,但如果性能和成本是一个因素,那么整个系统将至少是 32 位宽,如果不是 64 位的话。否则你就是在浪费周期和金钱。
  • 相关(启用缓存的情况):Are there any modern CPUs where a cached byte store is actually slower than a word store? - old_timer 的微基准测试显示 Cortex-m7 上的 cached 字节和字加载速度相同。只有字节/半字 stores 较慢。如果该 CPU 具有存储缓冲区,则 4 个连续的 STRB 可能是有效的。但这可能太简单了。具有存储缓冲区的高端 CPU 可以在提交缓存之前合并字节存储。 (但是负载不会在缓冲区中闲置,除非它错过了,每一个都只是发生)
  • @PeterCordes,谢谢,很有趣。我的理解是,启用缓存,连续执行 N 个字加载与执行 N 个字节加载所需的时间相同。所以最后如果你需要读取 N 个字节,使用字加载会快 4 倍(仅计算加载指令)。对吗?

标签: assembly stm32 cortex-m


【解决方案1】:

Cortex-M7 具有 64 位 AMBA4 AXI 接口。

这只是答案的一部分,因为这条数据总线将连接到某个地方的 STM32H7 的内存,但我们可以假设内存有一个至少与总线一样宽的接口。内存控制器很可能会从内存中读取整个宽度(但可能不是以核心频率)。

读取的数据将在总线上返回,无论握手需要多少个周期,都会占用读取通道。对于字节读取,返回的数据应该是一个字节。

执行 4 字节读取可以避免外部存储器访问,但会使总线忙于 4 次传输。总线可以支持多个未完成的传输(受限于芯片设计,而不是处理器)。在架构上,允许处理器合并传输(但这自然会由缓存完成,您已禁用它)。

在一阶近似下,您可以在与执行 4 字节读取相同的周期数内加载 8 个 32 位寄存器,因为存在 64 位 AXI。实际上,它可以更快,因为您可以使用单个 LDM 指令而不是 4 个 LDRB,并且指令获取共享同一总线。

需要注意的是,stores 是potentially more complex,因为很难构建忽略部分写入数据的逻辑,而且合并写入相当容易。

(这是一个“通用”答案,而不是 M7 微架构的反映,您需要进行自己的基准测试以了解您问题的详细含义)。

【讨论】:

  • 我鼓励你提供你自己的。 @P_J_
猜你喜欢
  • 2017-06-07
  • 2022-12-18
  • 2015-03-10
  • 2015-04-20
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多