新手入门
- 积分
- 16
- 金钱
- 16
- 注册时间
- 2020-5-28
- 在线时间
- 5 小时
|

楼主 |
发表于 2021-10-15 17:14:30
|
显示全部楼层
又研究了下,是我自己搞错了,结果是一致的,只是校验结果位排列不同。
PS:分享一下自己了解到的一些内容
同样的ECC校验有不同的实现方法或者说理解角度,校验结果也有各种排列方式,刚开始研究可能会造成困惑。介绍一下我遇到的3种实现:
- ECC校验原理 这篇文章介绍的比较详细,分行校验与列校验(网上大多介绍文章都分行列),每1个字节为一行,共有8列,且预计算0~255每个值的行列极性以优化计算时间,文中ECC结果排列为行校验在低位列校验在高位
- 正点原子开发指南中的介绍是把所有数据直接排一行,按只有行校验计算ECC,最终ECC结果低位即相当于上面的列校验,高位相当于上面的行校验,H743硬件ECC结果与此相同
- LevelX中的ECC计算是每2个字节为一行,共有16列,没有使用预计算极性表加速(不过16bit的表也太大了),结果排列与H743硬件同,只是整体偏移了2位
关于ECC纠错,本质都一样,但实现也有不同的方式(正点原子、LevelX以及我下面介绍的方法各不相同,但本质都是上面链接文章最后提到的判决过程),介绍一下我认为比较好的一种方式
- 前提是ECC使用上面介绍的正点原子/H743硬件ECC方式排列
- 新旧ECC相等的话说明没有错误,否则二者进行异或,注意ECC有效bit数为2log2(数据总bit数),例如256byte为2log2(256*8)=22bit、512byte为24bit
- 异或结果的bit0~1、bit2~3...以此类推全是01b或10b的话说明有1个bit翻转,异或结果奇数bit组成的数即为翻转bit的总索引
- 其他情况则表示无法纠正的错误
|
|