CRC Rocksoft模型中REFIN和REFOUT参数的用途

问题描述 投票:0回答:1

CRC 的 Rocksoft 参数模型是众所周知的。它包含两个布尔参数,称为 REFIN 和 REFOUT。我了解他们在做什么,也了解如何实施它们。

网络上有很多关于 Rocksoft 模型和那些参数的信息。我在网上不明白(也找不到)的是这些参数的purpose。甚至 Ross Williams Painless 指南似乎也没有解释原因。

这是关于内存架构上的字节顺序吗?是关于UARTS的传输顺序吗?是关于以“错误”顺序“随机”处理数据的实现吗?

因此,在实现(自定义)CRC 时: 我通常什么时候需要反映输入字节? 我通常什么时候需要反映输出字节?

endianness crc
1个回答
1
投票

通常你不需要在实现中反映。对于几乎所有的 CRC 定义,refin 和 refout 参数都是相等的。输入和输出都被反映,或者两者都不反映。如果两者都被反映,那么不是反映输入和输出,而是反映 CRC 实现本身。多项式被反映并且移位是向下而不是向上,这与反映输入和输出位具有完全相同的效果。然而,它占用的 CPU 时间为零,因为反射是在实现时而不是运行时完成的。

奇怪的是,在 Greg Cook 的目录中有一个 CRC 定义,CRC-12/UMTS,带有

refin=false refout=true
。在这种情况下,您可以在不进行反射的情况下实现 CRC,然后反射生成的 12 位 CRC(这仍然非常快)。

是否反映 CRC 的决定通常是在实现硬件移位寄存器时做出的,其中输入移位寄存器的位顺序例如是数据序列化的顺序。在某些情况下,数据的最低有效位首先传出线路,在这种情况下会反映 CRC,或者数据的最高有效位首先传出,在这种情况下不会反映 CRC。

另一次可能做出这样的决定是在完全以软件实现 CRC 时,不受任何硬件实现的影响。在这种情况下,一些人决定不反映 CRC,因为这与教科书中对 CRC 的定义最接近。其他人决定反映 CRC,此后执行中的指令数量可能会减少。例如,向下移位而不是向上移位可以避免数据或 CRC 的移位。它还可以避免必须屏蔽掉在更大的机器字中完成的未反映实现中向上移动的无关位。

在任何情况下,无论反映与否,CRC的检错性能都是一样的

为了说明速度优势,这是在软件中对 32 位未反映的逐位 CRC 计算中的每个字节执行的操作:

        crc ^= (uint32_t)data[i] << 24;
        for (unsigned k = 0; k < 8; k++)
            crc = crc & 0x80000000 ? (crc << 1) ^ 0x4c11db7 : crc << 1;

而对于反映的 CRC,它是:

        crc ^= data[i];
        for (unsigned k = 0; k < 8; k++)
            crc = crc & 1 ? (crc >> 1) ^ 0xedb88320 : crc >> 1;

(那些实现相同次数的 32 多项式,其中多项式的位反映在反映的实现中。)

按字节表查找同样的事情,首先是未反射的:

        crc = (crc << 8) ^ table_byte[((crc >> 24) ^ data[i]) & 0xff];

然后反思:

        crc = (crc >> 8) ^ table_byte[(crc ^ data[i]) & 0xff];

在这两种情况下,反射实现避免了每个输入字节移位。

© www.soinside.com 2019 - 2024. All rights reserved.