【问题标题】:Swap halfwords efficently高效交换半字
【发布时间】:2018-07-10 13:01:20
【问题描述】:

我想通过其 I2S 外设在 24 位模式下使用 DMA 从 STM32 (Cortex M4) 设备发送数据,MSB 在前。 然而,I2S 数据寄存器只有 16 位,根据数据表,您必须先发送高半字,然后再发送低半字。 这在使用 DMA 时是有问题的,它总是先发送低半字。

在 c 或 ARM 汇编程序中切换两个半字的有效方法是什么?

【问题讨论】:

  • 你目前的低效方式是什么?
  • w = (w<<8)|(w>>8),相信你的编译器。
  • 你能用 REV / REV16 指令预处理你的数据吗?您确定您的 DMA 不支持字节顺序交换吗?
  • 你可能是想说:w = (w>16) ?
  • @iBug 使用英特尔术语时您是对的。但是,OP 使用的是 RISC 术语,其中一个字是 32 位,一个半字是 16 位。

标签: c assembly arm stm32 spi


【解决方案1】:

写出常用的成语

unsigned w;
w = w << 16 | w >> 16;

优化编译器通常将其转换为单个 rorrev16 指令。期望编译器进行这种优化是合理的。确保w 是无符号的,所以右移是无符号的。

如果编译器不对此进行优化,它仍然只是两条指令(一个移位和一个带有移位操作数的或),因此不会损失太多性能。

【讨论】:

    猜你喜欢
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    相关资源
    最近更新 更多