高效交换半字

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;

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

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

【讨论】:

以上是关于高效交换半字的主要内容,如果未能解决你的问题,请参考以下文章

这么递名片才高效!教你给应用开发个交换名片功能

这么递名片才高效!教你给应用开发个交换名片功能

这么递名片才高效!教你给应用开发个交换名片功能

对分组交换(packet switching)高效迅速灵活可靠四个优点的理解

搞懂它,带你学会高效配置交换机!

SimSwap 高保真人脸交换的高效框架 以及 deepfake辨别图片或者视频真假 dalle-mini文字生成图片