有效地交换半字

Tob*_*obi 2 c assembly arm spi stm32

我想通过其I2S外设从STM32(Cortex M4)设备发送数据,使用24位模式的DMA,MSB优先.然而,I2S数据寄存器只有16位,根据数据表,您必须首先发送上半字,然后是下半字.这在使用DMA时会出现问题,它将始终首先发送下半字.

在c或ARM-assembler中切换两个半字的有效方法是什么?

fuz*_*fuz 8

写出常用的习语

unsigned w;
w = w << 16 | w >> 16;
Run Code Online (Sandbox Code Playgroud)

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

如果编译器没有优化它,它仍然只是两个指令(一个移位和一个或一个移位的操作数),因此不会丢失太多性能.