没有合适的资源?快使用搜索试试~ 我知道了~
本文分析和解释了实际CRC校验码的生成特点,据此给出节省RAM和ROM且运算快速的通用CRC校验编程思想和程序结构,并探讨了用少量硬件实现快速、可靠CRC校验的方法。
资源推荐
资源详情
资源评论
CRC校验编程和硬件快速校验探讨校验编程和硬件快速校验探讨
本文分析和解释了实际CRC校验码的生成特点,据此给出节省RAM和ROM且运算快速的通用CRC校验编程思想
和程序结构,并探讨了用少量硬件实现快速、可靠CRC校验的方法。
引 言
循环冗余校验(Cyclic Re&mdancy Check,
因此,对于嵌入式系统中的CRC校验,事先根据特定的校验多项式,算出1字节数据范围所对应的256个余数,将其作为表
格,
本文分析和解释了实际CRC校验码的生成特点,据此给出节省RAM和ROM且运算
1 CRC原理和实际校验码的反序生成特点
一个k位二进制数据在传送时,按一定规律附加一些冗余位而增大其码距,就能检错和纠错。标准CRC码是将原数据左移r
位,再用r+1位的特别约定多项式(poly—nomial funetion)模除之,获得最多为r(8、16、32)位的余数,跟随原数据之后生成
k+r位的编码发送。接收方再用相同的约定多项式,模除收到的数据,余数为O则传输无误,为其他值则对应各个位的出错。
但是对于实际应用,为加快通信速度,r位的余数并不是每次都传输,而是采用累计模加(异或)的方法,不断地与下一个k位
数据异或运算,组成新的中间余数(仍为r位,因一般选择r≥k),再被约定多项式模除得到新的余数值,依此类推,直到所有通
信数据都同中间余数异或,再模除完为止。如此得到最终的r位余数,作为全组数据校验的CRC码附在该组数据之后发送。接
收方以同样的过程,算得收到数组的最终余数,再同最后收到的CRC码对比(或将CRC码也作为数据,看最后余数是否为O)。
当然这样只能查出该组数据的传输是否有错,而不能纠错。
首数据的余数是唯一的,再异或进后续的任何一个特定数据之后,结果依然唯一。所以只要选择r有足够的位数,就能保证
多个数据中一旦有个别位传输错误,其最终的CRC余数与传输正确的余数相等的可能性极低,因此能查出传输错误。
对于元器件和不少的设备来说,其最终余数,即组校验的CRC码,是靠硬件快速生成的。为了使硬件电路简化,也为了接
收方易于校验编程,往往采用变形生成的CRC码和与其对应的校验处理方式。
对于模除余数的初始值,ISO/IEC 13239标准规定各位(8、16、32)均置1,而DSl8820器件和一些控制仪表的通信CRC码
却是清0。在软件编程时要根据不同器件赋予不同的初始值。
特别约定多项式g(x)都是r+1位的,如ISO/IEC13239标准的CRC一8,g(x)=x8+x2+x+1。其最高位恒为1,将其隐含则可简
化模除运算,但这样一来后面多位是O,较难在多字节(如16位需2字节)CRC校验中定位计算和存储。因此,大多数CRC码生
成和校验的处理都采用将约定多项式反序的方法,即将最低位1放到最高位并丢弃最高次幂系数1,从而将运算和存储都降为r
位。
对于CRC一8,g(x)=x8+x2+x+1,去高位反序后的模除数为11100000(OEOH),r=8。
对于CRC一16,g(x)=x16+x15+x2+1,去高位反序后的模除数为OA001H,r=16。
对于CRC一CCITT,g(x)=x16+x12+x5+1,同样处理后的模除数为8408H,但也常用正序值1021H。
对于CRC一32,g(x)=x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1,处理后的模除数为
0EDB88320H,r=32。
如上处理后,按理说被模除数和余数也应该反序。但这样的话r位的余数在同下一个k位数据模加时不但k位数据应反序,而
且必须左端(最高位)对齐进行异或,处理起来不但麻烦也容易出错。因此,实际CRC码的生成和校验一般仍是将余数,即被
(模)除数,按正序排列,新数据也仍是右对齐异或进余数中。但是将被模除数原先的左移r位右添0改成了右移r位左添(r个)O。
这相当于k+r位被模除数中仅r位被反序(放左端),而前面k位(现放于右端)依然正序。可以看出,按反序原则,实际上每一次都
是异或进通信数据的反序值,如11001000B(0C8H)变为000100ll(13H),再异或进被模除数来求取CRC校验码。但由于所有二
进制数的反序值都是唯一对应的,所以并不影响生成CRC码的唯一确定性,只是接收方需要按照同样的反序规则处理.
2 嵌入式系统CRC校验的编程
如上所述,k+r位的被模除数采用右移的方法不断地同反序的约定多项式对位模除,也就遵从了从高位向低位不断减余的除
法规则。但由于不必求模除的商,因此只要将被模除数不断地右移位,与去掉最高位的反序约定多项式模减,求得余数即可。
但如果被模除数最低位右端的移出位是O,则无论从左端添进多少个O,也不够模除约定多项式(其隐含的最高位是1)。在此
情况下该位的商是O,余数不变,不应再同约定多项式对位模减,而要继续左添O右移位,直到当前余数(被模除数)右移出的
位值为1才够模除(商1),才可将余数再对位模减一次多项式。由此看出,将约定多项式去掉最高位,可以使模减(异或)的计算
位数r减少(一般r都正好是1字节位数的整数倍)。
由于被模除数是k+r位的,因此总共需要右移k位,即左添进尼个O,才能模除到最低位结束。得到的余数最多是r位(约定多
项式为r+1位),再将它异或人一个新数据,作为新的被模除数。
每异或进一个数据,求新一轮CRC码,都只进行走(字节数据是一8)次的右移和一般都少于是次的模减(异或)运算,而且模
减的中间差值无需保留(后值覆盖前值)。因此CRC码生成的运算过程,就是右移位、判断移出位为1则同多项式模减(C语言不
能对移出位检测,需将余数备份后同0xol相“与”)、差值回存后再右移的是次循环过程,如图1所示。之后,再异或进下一个数
据(该步与查表法一致)。编程得当的话运算量很小。
笔者用51汇编语言编写(2R(:一8校验程序,算得1字节数据的CRC码,只需64~80个机器周期,只多用1字节RAM单元
(CR(:一16校验多用2字节,时间加倍)来存储余数,即下一次的被模除数(不断覆盖上一次已无用的)。因此,完全可以直接运
算,而不必存储大量的数据表格。C语言编程,要考虑语句代码的优化以及只定义使用int和char型局部变量,以免耗时和占用
RAM单元太多。
资源评论
weixin_38720461
- 粉丝: 8
- 资源: 924
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 华为云会议安装包适配华为擎云L410 -1060 ARM架构
- 清空redis缓存脚本指令
- STM8S微控制器-寄存器操作指南
- apk一键安装,获取apk签名信息
- opencv4.8.0+contrib+cuda文件
- 【全网最新最全】大气公司年度月度总结汇报PPT
- C语言实现低功耗STM32F411开发板(原理图+PCB源文件+官方例程+驱动等).zip
- C语言实现基于STM32 的联合调试侦听设备解决方案(原理图、PCB源文件、调试工具、视频).zip
- 【全网最全最酷】部门年度年终工作总结汇报PPT模板
- C语言实现基于STM32F103RC的电子相册(原理图、PCB源文件、程序源码及制作).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功