CRC校验---之avrbootloader
最高一位
就是我们所要求的余数。所以可以将上述步骤用下面的流程描述:
//reg 是一个5 bits 的寄存器
把 reg 中的值置0.
把原始的数据后添加r 个0.
While (数据未处理完)
Begin
If (reg 首位是1)
reg = reg XOR 0011.
把reg 中的值左移一位,读入一个新的数据并置于register 的0 bit 的位置。
End
reg 的后四位就是我们所要求的余数。
这种算法简单,容易实现,对任意长度生成多项式的G(x)都适用。在发
送的数据不长的情
况下可以使用。但是如果发送的数据块很长的话,这种方法就不太适合了。
它一次只能处理一位数
据,效率太低。为了提高处理效率,可以一次处理4 位、8 位、16 位、32
位。由于处理器的结构基
本上都支持8 位数据的处理,所以一次处理8 位比较合适。
为了对优化后的算法有一种直观的了解,先将上面的算法换个角度理解一下
。在上面例子中,
可以将编码过程看作如下过程:
由于最后只需要余数,所以我们只看后四位。构造一个四位的寄存器reg,
初值为0,数据依
次移入reg0(reg 的0 位),同时reg3 的数据移出reg。有上面的算法可以
知道,只有当移出的数据
为1 时,reg 才和g(x)进行XOR 运算;移出的数据为0 时,reg 不与g(x
)进行XOR 运算,相
当与和0000 进行XOR 运算。就是说,reg 和什么样的数据进行XOR 移出的
数据决定。由于只有一
个bit,所以有21种选择。上述算法可以描述如下,
//reg 是一个4 bits 的寄存器
初始化 t[]={0011,0000}
把reg 中的值置0.
把原始的数据后添加r 个0.
While (数据未处理完)
Begin
把reg 中的值左移一位,读入一个新的数据并置于register 的0 bit 的位置。
reg = reg XOR t[移出的位]
End
上面算法是以bit 为单位进行处理的,可以将上述算法扩展到8 位,即以
Byte 为单位进行处理,
即CRC-32。构造一个四个Byte 的寄存器reg,初值为0x00000000,数据依
次移入reg0(reg 的0
字节,以下类似),同时reg3 的数据移出reg。用上面的算法类推可知,移
出的数据字节决定reg 和
什么样的数据进行XOR。由于有8 个bit,所以有28种选择。上述算法可以描
述如下:
//reg 是一个4 Byte 的寄存器
初始化 t[]={…}//共有28=256 项
把 reg 中的值置0.
把原始的数据后添加r/8 个0 字节.
While (数据未处理完)
Begin
把reg 中的值左移一个字节,读入一个新的字节并置于reg 的第0 个byte 的
位置。
reg = reg XOR t[移出的字节]
End
CRC校验avrbootloade 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)