我正在 ARM7 处理器上编写一个嵌入式应用程序,对于通过串行链路发送的数据以及存储在闪存中的数据,我需要某种形式的校验和。我想知道这两个 CRC 中哪一个更适合这个目的。主要的权衡是代码速度与鲁棒性。我应该考虑另一个 CRC 吗?您是否有指向 ARM 的有效实施的链接?
5 回答
CRC32 相对便宜且实施速度快。W3C 网站上的 PNG 示例代码中有一个信誉良好且高效的实现(表格成本 = 1Kbyte RAM,无需 EEPROM 资源即可轻松生成)。如果您在那里寻找其他 CRC 实现,您可以权衡表内存大小与计算时间。
RFC1071 是一个简单的 16 位字节对和。因此,有可能两个错误可以“取消”,并且仍然给出“通过”校验和。例如,一个位错误将一位从 1 翻转到 0。然后另一个位错误 16 位稍后将一位从 0 翻转到 1。RFC1071 不会检测到这一点。但是,如果使用 CRC 进行检查,则会检测到相同的双位翻转错误。
这种双位翻转错误在串行传输中是可能的。(在并行电缆上更有可能,特别是如果一根线“嘈杂”但如今谁在使用并行?)在闪存芯片中也有可能,特别是如果 PCB 在微型和闪存芯片之间的焊点不良时。总体而言,CRC 在检测错误方面在统计上更加稳健,因为输入中的单个位变化会影响 CRC 移位寄存器中的多个位。
在实践中,您想要检测的另一件事可能是不完整的 Flash 上传,因此大量代码完全丢失。为此,统计上校验和可能很好,但我一直喜欢在我从事的项目中使用 CRC。使用基于表格的 CRC 算法,我们已经能够获得所需的计算速度。
在这种情况下采用您能负担得起的最佳校验和。闪存可能不会经常进行,因此闪存校验和可能比串行通信的校验和更复杂。
我想到的其他校验和:
- CRC32
- MD5
- SHA1
但这完全取决于您正在执行的应用程序以及如果您未检测到错误可能造成的危害。
在这里查看更多输入:http ://en.wikipedia.org/wiki/List_of_checksum_algorithms
闪存数据可能是您不想损坏的东西,所以 crc 很好。另一部分是串行协议。鉴于串行链接的速度较慢,您应该使用 crc。ARM7 芯片可以以远高于串行链路速度的速度处理以太网校验和,因此代码速度应该不是问题,并且您将获得巨大的鲁棒性提升。
对于闪存或(尤其是)OTP 之类的东西,最好同时拥有像 CRC 这样的东西,它可以很好地捕捉错误的随机组合,以及一个足够长不会溢出的补码校验和。后者将具有以下优点:将检测到仅包括错误设置位或仅包括错误清除位的任何错误组合。