我需要在使用 ARM Cortex M4 处理器的嵌入式系统中尽快交换缓冲区中的备用字节。我用的是海湾合作委员会。数据量可变,但最大略高于 2K。转换一些额外的字节并不重要,因为我可以使用超大的缓冲区。
我知道 ARM 有这REV16条指令,我可以用它来交换 32 位字中的交替字节。我不知道的是:
有没有一种方法可以在 gcc 中获取这条指令而无需求助于汇编程序?该__builtin_bswap16内在函数似乎仅对 16 位字进行操作。一次转换 4 个字节肯定比转换 2 个字节快。
Cortex M4 是否有重排序缓冲区和/或寄存器重命名?如果不是,当我在部分展开的循环中转换缓冲区的双字时,我需要做什么来最大限度地减少管道停顿?
例如,这段代码是否有效,其中REV16适当定义为解决(1):
uint32_t *buf = ... ;
size_t n = ... ; // (number of bytes to convert + 15)/16
for (size_t i = 0; i < n; ++i)
{
uint32_t a = buf[0];
uint32_t b = buf[1];
uint32_t c = buf[2];
uint32_t d = buf[3];
REV16(a, a);
REV16(b, b);
REV16(c, c); …Run Code Online (Sandbox Code Playgroud)