我想使用DMA在24位模式下通过STM32(Cortex M4)设备的I2S外设发送数据,首先是MSB。
但是,I2S数据寄存器只有16位,根据数据手册,您必须先发送高半字,然后发送低半字。
使用DMA时这是有问题的,它将始终首先发送低半字。

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

最佳答案

写出常见的成语

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

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

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

关于c - 有效交换半字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48541818/

10-10 14:14