ARM - 使用 16 位数据总线获取 32 位数据

Posted

技术标签:

【中文标题】ARM - 使用 16 位数据总线获取 32 位数据【英文标题】:ARM - Fetching 32 bits of data using 16-bit data bus 【发布时间】:2016-05-13 01:10:05 【问题描述】:

在我们的嵌入式平台上,某些设备具有 16 位数据总线(例如 FPGA)。但是,我们需要将它们读取为 32 位值(例如 32 位浮点)。

我的理解是,当 16 位内存被 32 位数据加载指令 (LDR) 访问时,ARM 处理器会执行 2 次 16 位取指来组装一个 32 位数量。

这是正确的吗?

例如,我希望 ARM 处理器从具有 16 位数据总线的设备中加载 uint32_t 值,而不必进行 2 次 uint16_t 读取,然后将 uint16_t 值合并为一个 uint32_t 变量.

我们是否需要显式获取 2 个 16 位数量,然后组装为 32 位数量?

哪些 ARM 文档包含此说明?

是否有任何特定的 ARM 配置设置让 ARM 从 16 位数据总线进行 2 次提取以形成 32 位数量(在寄存器中)?

仅供参考:我们使用的是 ARM Cortex A8 和 IAR EW IDE/编译器。 平台运行的是“系统”模式而不是“拇指”模式。

【问题讨论】:

用户手册...... amba/axi 文档。你有一个 16 位宽总线的 Cortex A8 吗?我会假设 64 位宽,也许是 32,但 16 没有意义。顺便说一句,总线和处理器负责所有这些,请参阅 amba/axi 文档。在非 64 位对齐的地址上针对 64 位宽 axi 的 8 字 stm 指令至少会导致奇数字的长度为 1 传输,然后是长度为 3 的传输和另一个长度为 1 的传输来处理另一个奇数单词。所有这些都由硬件神奇地处理,软件永远不需要关心。 (除非你是在推平台的性能或者是在测试芯片设计) 所有这些都在芯片内处理,如果您的 fpga 在该芯片上的某个总线上,那么您必须查看该芯片供应商的文档。如果您在 fpga 中使用 arm,那么您可能可以直接访问 amba/axi,或者您可能需要查看 fpga 芯片供应商的文档。不管它是什么都有据可查,这取决于你附加到什么接口。 你太复杂了,拇指模式在这里也无关紧要,它被转换成手臂指令,然后被送入管道和/或它与 amba/axi 总线或其他总线无关在远端,总线上没有任何东西表明正在使用的指令集解码器。 【参考方案1】:

如果你正在访问内存,当 CPU 需要 32 位内存时,它会直接请求它(Cortex-A8 不支持 16 位总线)。一些外设(在系统中)负责将 32 位请求转换为 16 位以适应总线(Doing 2 transfer)。

这意味着对于 CPU 来说应该是完全透明的。

【讨论】:

我不明白。我们有 MRAM,它是 16 位宽的。我们的 FPGA 有 16 位寄存器。我们的硬件团队是不是因为你说 Cortex-A8 不支持 16 位数据总线而犯了大错。 @ThomasMatthews 好吧,实际 Cortex-A8 块本身上的数据总线 is either 64 or 128 bits wide depending on configuration,你的 RAM 芯片几乎肯定挂在某种内存控制器上,它本身通常可能有 32 或 64-到系统端的位宽接口,并且在它们之间的互连周围可能还有各种其他的增减器。考虑与硬件人员交朋友,并请他们大致了解您的芯片是如何组合在一起的;)

以上是关于ARM - 使用 16 位数据总线获取 32 位数据的主要内容,如果未能解决你的问题,请参考以下文章

8080、8088、80286、80386CPU的数据总线分别为16跟,20根,24根,32根,为

指令,操作系统位数,32位与64位 x86 arm 处理器 ,概念概览

CPU位数操作系统位数及如何在Linux下查看

arm伪处理器使用的是啥总线标准

8位16位32位单片机区别

嵌入式MCU ARM Cortex-M3工作模式与异常