有效地交换半字

Swap halfwords efficently

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

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

写出常用成语

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

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

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