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