这是一份关于 CRC 错误检测算法的无痛指南,包含理论、实现细节及相关参考等内容:
理论部分:
- 误差检测目的是让接收方确定消息是否被损坏,通过发送方构造校验和并附加在消息后,接收方计算校验和进行比较。
- 简单的校验和算法易受随机错误影响,需用更复杂的公式替代简单求和,如 CRC 算法利用除法,将消息视为二进制数除以固定二进制数,余数作为校验和。
- CRC 算法基于多项式算术,将除数、被除数等视为二进制系数的多项式,进行无进位的二进制运算,如乘法是多项式相乘后按模 2 计算系数。
- CRC 算法的关键是 CRC 算术,加法和减法等价于异或操作,乘法是数与移位后的自身相加,除法通过比较最高位确定是否相除。
实现部分:
- 实现 CRC 算法需实现 CRC 除法,因机器除法指令和寄存器大小限制,需用除法寄存器处理消息。
- 简单的 CRC 算法(SIMPLE 算法)直接用位操作进行除法,但效率低,可通过将算法处理单位改为字节等方式提速,得到表驱动算法(TABLE 算法),通过预计算组装为表来提高效率。
- 进一步优化得到稍修改的表驱动算法(DIRECT TABLE ALGORITHM),避免了对消息末尾零字节的处理。
- 硬件中 UART 习惯先传输最低位后传输最高位,导致硬件 CRC 计算器处理字节时将字节内部的位也进行交换,形成“反射”算法,软件处理时也需相应反射字节。
- 除反射算法外,还有“反转”多项式的概念,即整个多项式(包括隐含的最高位 1)进行反转,与反射算法不同。
- CRC 算法在初始值和最终异或值等方面也有差异,需根据实际情况选择合适的初始值以避免“盲点”。
模型与参考:
- 定义了参数化的 Rocksoft^tm 模型 CRC 算法,包括名称、宽度、多项式、初始值、输入输出反射等参数,可用于精确指定特定的 CRC 算法。
- 给出了常见 CRC 标准的多项式参数列表,并提供了模型算法的 C 语言实现代码(包含头文件和实现文件)及生成 CRC 查找表的程序。
其他信息:
- 文中还提及了一些相关的参考资料,如[Griffiths87]、[Knuth81]、[Nelson91]、[Sarwate88]、[Tanenbaum81]等,以及一些未找到具体内容的参考文献。
总之,该指南全面介绍了 CRC 算法的各个方面,从理论到实践,从简单算法到优化实现,为理解和使用 CRC 算法提供了详细指导。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。