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