微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > CRC校验---之avrbootloader

CRC校验---之avrbootloader

时间:11-13 来源:互联网 点击:

最高一位
就是我们所要求的余数。所以可以将上述步骤用下面的流程描述:
//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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top