我被分配使用CRC8的CRC32更新现有固件。背景是2个MCU使用串行通信进行通信。当我在网上做一些研究时,我看到了2个版本的CRC计算。第一个版本是
uint32_t CalcCRC32(const uint8_t *pData, uint32_t length, uint32_t crc)
{
const uint8_t *end = pData + length;
while (pData < end)
{
crc ^= *pData++;
for(i=0; i<8; i++){
crc = crc & 0x80000000 ? (crc << 1) ^ 0x04C11DB7 : (crc << 1);
}
}
return crc;
}
第二个版本是
uint32_t CRC32_function(uint8_t *pData, uint32_t len, uint32_t crc){
uint32_t val, crc;
uint8_t i;
crc = 0xFFFFFFFF;
while(len--){
val=(crc^*pData++)&0xFF;
for(i=0; i<8; i++){
val = val & 0x1 ? (val>>1)^0xEDB88320 : val>>1;
}
crc = val^crc>>8;
}
return crc^0xFFFFFFFF;
}
我的假设是我必须使用第一个功能的第一个MCU和第二个功能的第二个MCU,因为多项式0xEDB88320是0x04C11DB7的反向。我是正确的吗?如果不是,我会非常感谢的建议。提前感谢。
2条答案
按热度按时间2cmtqfgy1#
不,这是不正确的。您将在两端使用相同的函数,或至少是等效的计算。
这两个函数计算两个完全不同的CRC-32。第二个函数是一个非常标准的CRC-32,广泛使用的CRC-32/ISO-HDLC,可以在zlib中快速软件实现(比您显示的简单位函数快得多)。
第一个函数计算一个未出现在CRC目录中的纯CRC,但它可能在其来源的应用程序中用于预处理和后处理,以计算CRC-32/BZIP 2或CRC-32/MPEG 2。
lyfkaqu12#
功能提示
在发射机和接收机中使用相同的环路。
速度提示
使用串行通信-如果一次执行1个字节,即使在高波特率下,如果CRC一次执行一个字节,则CPU可能有大量时间执行CRC。
IOW,在发送/接收时计算CRC,而不是之后。
伪码
现在你的CRC计算不会在最后一个字节后花费大量时间-延迟的改善。