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