高效交换半字
Posted
技术标签:
【中文标题】高效交换半字【英文标题】: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 位。
【参考方案1】:
写出常用的成语
unsigned w;
w = w << 16 | w >> 16;
优化编译器通常将其转换为单个 ror
或 rev16
指令。期望编译器进行这种优化是合理的。确保w
是无符号的,所以右移是无符号的。
如果编译器不对此进行优化,它仍然只是两条指令(一个移位和一个带有移位操作数的或),因此不会损失太多性能。
【讨论】:
以上是关于高效交换半字的主要内容,如果未能解决你的问题,请参考以下文章