對嵌入式系統(tǒng)至關重要的數(shù)據(jù)完整性
軟件工程師有一個非常樂觀的壞習慣。這種樂觀情緒通常不僅包括他們對完成特定任務需要多長時間的計算,還包括他們系統(tǒng)的潛在故障模式。如果它在工作臺上工作,假設它也將在現(xiàn)場工作,無論該現(xiàn)場是在嘈雜的制造車間還是繞地球運行。不幸的是,這些假設是樂觀的,其中最大的假設之一是數(shù)據(jù)始終有效。我曾經參與過一個項目,其中來自傳感器的數(shù)據(jù)被破壞,無法驗證傳感器數(shù)據(jù)是否正確。今天的文章將探討嵌入式開發(fā)人員在數(shù)據(jù)完整性方面幾種方法。
提示 #1 – 至少使用奇偶校驗
奇偶校驗是一種數(shù)據(jù)完整性機制,它查看數(shù)據(jù)流中 1 的數(shù)量,然后調整奇偶校驗位以使 1 的總數(shù)為奇數(shù)或偶數(shù)。例如,假設傳感器傳輸 16 位寬且奇校驗的數(shù)據(jù)消息。其中一位,通常是最低有效位 (LSB) 將用于設置奇偶校驗。如果要發(fā)送的數(shù)據(jù)是:
1000 1000 1000 100x
然后為了奇校驗,將 x 設置為 1,這樣數(shù)據(jù)中有五個 1。如果奇偶校驗是偶數(shù),那么 x 將被設置為 0,因為數(shù)據(jù)中已經有四個 1。
奇偶校驗適用于檢測單個位翻轉。如果零變成一或一變成零,則可以檢測到奇偶校驗錯誤。但是,如果兩個或更多位翻轉,則可能無法檢測到錯誤。對于這種情況,需要更強大的技術。
提示 #2 – 使用校驗和
校驗和是一種算法,旨在檢測數(shù)據(jù)集中自然或隨機發(fā)生的錯誤。通常在一組數(shù)據(jù)上計算校驗和,然后得出數(shù)據(jù)的校驗和。數(shù)據(jù)集通常包含數(shù)據(jù)中的校驗和,因此在計算校驗和時會忽略這些字節(jié)。然后將計算出的校驗和與數(shù)據(jù)附帶的校驗和進行比較,以查看它們是否匹配。
重要的是要認識到并非所有校驗和都相同,并且可以檢測到不同的錯誤。例如,一個校驗和可能能夠檢測到單個位已經改變,但不同的校驗和可能能夠檢測幾個位是否同時改變。僅僅因為發(fā)現(xiàn)校驗和匹配并不能保證數(shù)據(jù)中沒有錯誤!校驗和也擅長檢測隨機錯誤,但不一定會檢測到故意更改,例如有人試圖破壞系統(tǒng)。嵌入式開發(fā)人員需要仔細選擇他們選擇用于其應用程序的校驗和。
提示 #3 – 使用循環(huán)冗余校驗 (CRC)
CRC實際上是一個校驗和,但它是一種非常特殊的校驗和。CRC 是使用多項式除法計算校驗和的校驗和。可以想象,在嵌入式系統(tǒng)上,尤其是基于微控制器的嵌入式系統(tǒng)上,執(zhí)行多項式除法的計算成本很高!不過,還有一些額外的好處,即 CRC 可以檢測到比簡單校驗和更大范圍的錯誤。CRC 非常有效,以至于許多微控制器供應商將包括一個基于硬件的 CRC 計算器,以允許開發(fā)人員有效地使用 CRC。不幸的是,它是否包含在內是非常偶然的,因此開發(fā)人員需要仔細閱讀他們的微控制器數(shù)據(jù)表。
結論
在數(shù)據(jù)收集和分析不斷增長的世界中,嵌入式開發(fā)人員要意識到我們的系統(tǒng)無法信任總線上的每一點數(shù)據(jù)。電磁干擾、宇宙射線和其他來源可能導致位翻轉并損壞。如果沒有某種機制來檢測這些位翻轉,則可能會對數(shù)據(jù)采取行動,雖然在許多情況下這沒什么大不了的,但有時它可能對系統(tǒng)造成災難性影響。我們今天討論的三種技術簡單且易于實施,并且可以對進出系統(tǒng)的所有數(shù)據(jù)進行簡單的完整性檢查。