有效地交换半字

时间:2018-01-31 12:08:26

标签: c assembly arm stm32 spi

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

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

1 个答案:

答案 0 :(得分:8)

写出常用的习语

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

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

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