软件工程师有一个非常乐观的坏习惯。这种乐观情绪通常不仅包括他们对完成特定任务需要多长时间的计算,还包括他们系统的潜在故障模式。如果它在工作台上工作,假设它也将在现场工作,无论该现场是在嘈杂的制造车间还是绕地球运行。不幸的是,这些假设是乐观的,其中最大的假设之一是数据始终有效。我曾经参与过一个项目,其中来自传感器的数据被破坏,无法验证传感器数据是否正确。今天的文章将探讨嵌入式开发人员在数据完整性方面几种方法。
提示 #1 – 至少使用奇偶校验
奇偶校验是一种数据完整性机制,它查看数据流中 1 的数量,然后调整奇偶校验位以使 1 的总数为奇数或偶数。例如,假设传感器传输 16 位宽且奇校验的数据消息。其中一位,通常是最低有效位 (LSB) 将用于设置奇偶校验。如果要发送的数据是:
1000 1000 1000 100x
然后为了奇校验,将 x 设置为 1,这样数据中有五个 1。如果奇偶校验是偶数,那么 x 将被设置为 0,因为数据中已经有四个 1。
奇偶校验适用于检测单个位翻转。如果零变成一或一变成零,则可以检测到奇偶校验错误。但是,如果两个或更多位翻转,则可能无法检测到错误。对于这种情况,需要更强大的技术。
提示 #2 – 使用校验和
校验和是一种算法,旨在检测数据集中自然或随机发生的错误。通常在一组数据上计算校验和,然后得出数据的校验和。数据集通常包含数据中的校验和,因此在计算校验和时会忽略这些字节。然后将计算出的校验和与数据附带的校验和进行比较,以查看它们是否匹配。
重要的是要认识到并非所有校验和都相同,并且可以检测到不同的错误。例如,一个校验和可能能够检测到单个位已经改变,但不同的校验和可能能够检测几个位是否同时改变。仅仅因为发现校验和匹配并不能保证数据中没有错误!校验和也擅长检测随机错误,但不一定会检测到故意更改,例如有人试图破坏系统。嵌入式开发人员需要仔细选择他们选择用于其应用程序的校验和。
提示 #3 – 使用循环冗余校验 (CRC)
CRC实际上是一个校验和,但它是一种非常特殊的校验和。CRC 是使用多项式除法计算校验和的校验和。可以想象,在嵌入式系统上,尤其是基于微控制器的嵌入式系统上,执行多项式除法的计算成本很高!不过,还有一些额外的好处,即 CRC 可以检测到比简单校验和更大范围的错误。CRC 非常有效,以至于许多微控制器供应商将包括一个基于硬件的 CRC 计算器,以允许开发人员有效地使用 CRC。不幸的是,它是否包含在内是非常偶然的,因此开发人员需要仔细阅读他们的微控制器数据表。
结论
在数据收集和分析不断增长的世界中,嵌入式开发人员要意识到我们的系统无法信任总线上的每一点数据。电磁干扰、宇宙射线和其他来源可能导致位翻转并损坏。如果没有某种机制来检测这些位翻转,则可能会对数据采取行动,虽然在许多情况下这没什么大不了的,但有时它可能对系统造成灾难性影响。我们今天讨论的三种技术简单且易于实施,并且可以对进出系统的所有数据进行简单的完整性检查。
发表评论 取消回复