Embedded 我应该为嵌入式应用程序使用CRC-16还是IP校验和(RFC1071)?

Embedded 我应该为嵌入式应用程序使用CRC-16还是IP校验和(RFC1071)?,embedded,arm,checksum,crc,Embedded,Arm,Checksum,Crc,我正在ARM7处理器上编写一个嵌入式应用程序,我需要对通过串行链路发送的数据以及存储在闪存中的数据进行某种形式的校验和。我想知道两个CRC中哪一个更适合这个目的。主要的权衡是代码速度和健壮性。我应该考虑另一个CRC吗?您是否有ARM高效实现的链接?在这种情况下,尽您所能获取最佳校验和。闪存可能不经常进行,因此闪存校验和可能比串行通信的校验和更复杂 我心目中的其他校验和: CRC32 MD5 沙一 但这完全取决于您正在执行的应用程序,以及如果未检测到错误可能造成的危害 在这里查看更多信息:CR

我正在ARM7处理器上编写一个嵌入式应用程序,我需要对通过串行链路发送的数据以及存储在闪存中的数据进行某种形式的校验和。我想知道两个CRC中哪一个更适合这个目的。主要的权衡是代码速度和健壮性。我应该考虑另一个CRC吗?您是否有ARM高效实现的链接?

在这种情况下,尽您所能获取最佳校验和。闪存可能不经常进行,因此闪存校验和可能比串行通信的校验和更复杂

我心目中的其他校验和:

  • CRC32
  • MD5
  • 沙一
但这完全取决于您正在执行的应用程序,以及如果未检测到错误可能造成的危害


在这里查看更多信息:

CRC32相对便宜,实现起来也很快。在中有一个信誉良好且高效的实现(表的成本=1Kbyte RAM&它可以在不需要EEPROM资源的情况下轻松生成)。如果您考虑其他CRC实现,您可以在计算时间上权衡表内存大小。

闪存数据可能是您不希望损坏的,所以CRC是好的。另一部分是串行协议。鉴于串行链路的速度较慢,您应该使用crc。
ARM7芯片可以以远高于串行链路的速度处理以太网校验,因此代码速度应该不会成为问题,并且您将获得健壮性的巨大提高。

RFC1071是一个简单的16位字节对总和。因此,两个错误可能会“抵消”,并且仍然给出“通过”校验和。例如,位错误将位从1翻转到0。然后,16位之后的另一位错误将从0位翻转到1位。RFC1071将不会检测到这一点。但如果使用CRC进行检查,同样的双位翻转错误也会被检测到

这种双位翻转错误在串行传输中是可能的。(在平行电缆上更可能出现这种情况,特别是当一根电线“有噪音”时,但现在谁在使用平行线呢?)在闪存芯片中也可能出现这种情况,特别是当PCB在micro和闪存芯片之间的焊点不良时。总的来说,CRC在检测错误时在统计上更为稳健,因为输入中的单个位变化会影响CRC移位寄存器中的多个位


在实践中,另一件您可能想要检测的事情是一个不完整的Flash上传,因此大量代码丢失。对于这一点,统计上的校验和可能是好的,但在我所从事的项目中,我一直喜欢CRC。使用基于表的CRC算法,我们能够获得所需的计算速度。

对于闪存或(特别是)OTP之类的东西,通常最好既有CRC这样的东西,它可以很好地捕获错误的随机组合,又有一个长度足够长而不会溢出的补码校验和。后者的优点是,将检测到仅包含错误设置位或仅包含错误清除位的任何错误组合。

CRC也允许纠错,MD5和SHA1专门设计为不允许纠错。它们的计算速度也相当慢(在大多数硬件上要慢好几倍)。我总是建议CRC来进行流数据完整性检查,只有当真正重要的是,如果不需要对中间攻击或身份验证机制(例如,计算机-> USB电缆上的设备)进行编码时,才需要真正的CRC,那么CRC应该很好。CRC32现在在很多方面都是标准的,包括以太网。现在,即使是嵌入式机器也可以相当快地处理它。MD5/SHA1/etc用于加密数据完整性,例如检测篡改。CRC仅用于传输完整性,这可能是OP想要的。实际上-MD5、SHA1等可以检测任何类型的更改。但他们无法纠正这些错误。例如,因为MD5使用更多的位,所以任何更改都很可能不会创建冲突。如果你有带宽,你可以用它来检测传输错误(就像微软在Windows7ISOS上做的那样)。当然,MD5,SHA1可以检测到变化。但是,由于设计用于加密目的,它们在非恶意错误检测方面的杀伤力过大(CPU周期超过了必要的数量)。