2

我正在尝试使用 STM/LDM 指令在使用 ARM Compiler 5 armcc 编译的 .c 文件中的内联汇编中生成AXI总线突发访问。

inline void STMIA2(uint32_t addr, uint32_t w0, uint32_t w1)
{
    __asm {
        STMIA addr!, { w0, w1 }
    }
}

但是 ARM 编译器 armcc 用户指南第 7.18 段说:“所有 LDM 和 STM 指令都扩展为具有等效效果的 LDR 和 STR 指令序列。但是,编译器随后可能会在优化期间将单独的指令重新组合成 LDM 或 STM。 "

这就是实际发生的情况,在某些情况下,LDM/STM 会扩展为一组 LDR/STR,并且这些指令的顺序是任意的。这会影响性能,因为我们使用针对突发处理进行优化的硬件。这也破坏了功能的正确性,因为我们使用的硬件考虑了单词的顺序并忽略了偏移量(但编译器认为更改指令的顺序是安全的)。

为了解决这个问题,可以使用嵌入式汇编程序而不是内联汇编程序,但这会导致额外的函数调用——返回影响性能的因素。

所以我想知道是否有办法在不损失性能的情况下正确生成 LDM/STM?我们能够在 GCC 中做到这一点,但没有找到 armcc 的任何解决方案。

目标 CPU:Cortex M0+ (ARMv6-M)。

编辑: 从设备都是片上设备,其中大部分是非内存设备。对于支持地址空间的突发访问区域的非内存从属的每个寄存器都被保留(例如[0x10000..0x10100]),我不完全确定为什么,也许CPU或总线不支持固定(非增量) 地址。HW 忽略该区域内的偏移量。例如,完整请求可以是 16 个字节,完整请求的第一个字是写入的第一个字(即使偏移量非零)。

4

1 回答 1

1

所以我想知道是否有办法在不损失性能的情况下正确生成 LDM/STM?我们能够在 GCC 中做到这一点,但没有找到 armcc 的任何解决方案。

关于编译器优化的一点点。 寄存器分配是它最艰难的工作之一。任何编译器代码生成的核心都可能是它分配物理 CPU 寄存器的时候。大多数编译器都使用单一静态赋值或SSA将您的“C”变量重命名为一堆伪变量(或时间顺序变量)。

为了让您的 STMIA 和 LDMIA 工作,您需要负载和存储保持一致。即,如果它是stmia [rx], {r3,r7}和恢复类似ldmia [rx], {r4,r8}的'r3'映射到新的'r4'和存储的'r7'映射到恢复的'r8'。对于任何编译器来说,这并不简单,因为“C”变量将根据需要进行分配。同一变量的不同版本可能在不同的寄存器中。为了完成这项stm/ldm工作,必须分配这些变量,以便寄存器以正确的顺序递增。即,对于ldmia上述情况,如果编译器想要存储r7r0(可能是返回值?),它没有办法在ldm不生成额外代码的情况下创建一个好的指令。

你可能已经让 gcc 来生成它,但这可能是运气。如果您只使用 gcc,您可能会发现它不起作用。

有关 GCC stm/ldm 的问题,请参阅:ldm/stm 和 gcc

以你为例,

inline void STMIA2(uint32_t addr, uint32_t w0, uint32_t w1)
{
    __asm {
        STMIA addr!, { w0, w1 }
    }
}

的值inline是整个函数体可以直接放在代码中。调用者可能在寄存器 R8 和 R4 中有w0and 。w1如果函数不是inline,则编译必须将它们放在 R1 和 R2 中,但可能会产生额外的移动。任何编译器都很难满足ldm/stm一般的要求。

这会影响性能,因为我们使用针对突发处理进行优化的硬件。这也破坏了功能的正确性,因为我们使用的硬件考虑了单词的顺序并忽略了偏移量(但编译器认为更改指令的顺序是安全的)。

如果硬件是总线上特定的非内存从设备外设,那么您可以将写入该从设备的功能包装在外部包装器中并强制分配寄存器(请参阅AAPCS),这样ldm/stm才能工作。这将导致性能下降,可以通过设备驱动程序中的某些自定义汇编程序来缓解。

但是,听起来设备可能是内存?在这种情况下,您遇到了问题。通常,像这样的存储设备只会使用缓存?如果您的 CPU 具有 MPU(内存保护单元)并且可以同时启用数据和代码缓存,那么您可能会解决此问题。高速缓存行将始终是突发访问。只需在代码中小心设置 MPU 和数据缓存。 OPs Cortex-M0+ 没有缓存并且设备是非内存的,所以这是不可能的(也不需要)。

如果您的设备是内存并且您没有数据缓存,那么您的问题可能无法解决(无需大量努力)并且您需要不同的硬件。或者你可以像外围设备一样包装它并降低性能;失去了存储设备随机访问的好处。

于 2015-10-17T16:14:42.193 回答