简单的错误检查以替换闪存中的重复代码

时间:2013-01-29 17:29:55

标签: algorithm checksum crc

我在 flash 内存中有一个16位字段,用于存储 8位数字(更具体地说,是0到254范围内的闭合范围内的值) 。我想使用额外的8+位进行错误检查(不需要纠错),最明显的方法就是重复两次。只有稍微不那么明显的是 XMODEM 数据包编号方法:将数字存储在第一个八位字节中,255减去第二个八位字节中的数字。

是否有更好的选项可以在可用空间中提供更强大的错误检测,并且易于实现和快速执行?也许闪存位更可能从 1 <0 而不是 0到1 的事实可以被利用?

2 个答案:

答案 0 :(得分:1)

如果我理解你的困境,那么你正在尝试检测因为你正在使用闪存而逐渐消失的位。问题是如果它们在一个八位字节中消失,那么它们也会在其他八位字节中消失。所以这告诉你简单的复制是行不通的。

就个人而言,我会否定数字并存储它。这样,如果值为1(例如,大多为零),则使用11111110(主要是1),因此数据消失将是显而易见的。

如果数据接近全零的降级非常糟糕,问题会变得更加严重。因此,使用否定将有很大帮助,因为不存在所有数据都应为零的情况。

答案 1 :(得分:1)

预先注意:我认为XMODEM方法是合理的,所以我会采用它并开始处理更重要的事情。无论如何,你用算法标记了这个问题,所以你也可以用证明这一点的方式来解决这个问题......

由于您需要进行错误检测,因此最重要的部分是可以检测到任何更改单个位的情况,因此数字的两个表示形式不能仅相隔一位,最好是它们尽可能远。此外,并非每次改变都有可能发生。

如果将其建模为图形,则将获得由16位数字标识的顶点以及定义该过渡概率的两个顶点之间的有向边。这将是一个完整的图表,所以想想你如何存储它(如果你存储它而不是按需计算它)。你现在要搜索的是一个圆形路径,正好有255个顶点,最大权重。

为此,只需搜索具有255个顶点的任何圆形路径,使用倾向于重边缘的DFS。从这个圆圈中,取出最轻的边缘并从图形中移除所有非重边缘。然后,重复搜索结果(可能已断开!)图表中的图形,直到找不到它为止。

最后,将输入值映射到其余圆圈(其中一个)的顶点ID,以将它们存储在闪存中。