【发布时间】: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 倍(仅计算加载指令)。对吗?