【问题标题】:Simple error checking to replace repetition code in flash简单的错误检查以替换闪存中的重复代码
【发布时间】:2013-01-13 08:47:45
【问题描述】:

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

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

【问题讨论】:

  • 谁投了反对票,如果你也解释一下原因会更有用。如果您认为这是错误的论坛并且可以建议一个更好的论坛,那也很有用。

标签: algorithm checksum crc


【解决方案1】:

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

既然你想要错误检测,最重要的部分是可以检测到任何变化的单个位,因此数字的两个表示不能仅相隔一个位,最好它们尽可能相距遥远。此外,并不是每一个位的变化都同样可能发生。

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

为此,只需使用具有重边倾向的 DFS 搜索任何具有 255 个顶点的圆形路径。从这个圆圈中,取其最轻的边并从图中删除所有非较重的边。然后,在生成的(可能是断开的!)图表中重复搜索一个图表,直到找不到任何一个。

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

【讨论】:

  • 不应该是最小重量吗?我想要一组最不可能相互转换的代码字(顶点),所以这将是一组最低的概率。
  • 你说得对,我在思考变革阻力时写了过渡概率。 BTW:后来我突然想到,这实际上是对权重限制的线性搜索,但我认为你也可以进行二分搜索,减少步数。
【解决方案2】:

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

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

如果退化到数据接近全零的程度真的很糟糕,问题就会变得更加严重。因此,使用否定会有很大帮助,因为不存在所有数据都应该为零的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 2011-03-09
    • 2016-02-12
    • 2014-08-16
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多