CAN息線系統(tǒng)中的一種安全隱患
1 出錯(cuò)的情況
在CAN協(xié)議2.OA版3.1.3款中提到:為了使報(bào)錯(cuò)幀正確結(jié)束,消極報(bào)錯(cuò)節(jié)點(diǎn)可能需要處于空閑狀態(tài)至少3位的時(shí)間(如果消極報(bào)錯(cuò)接收節(jié)點(diǎn)發(fā)生本地錯(cuò)),因此總線不應(yīng)滿負(fù)荷運(yùn)行。這是引發(fā)應(yīng)用故障的原因。節(jié)點(diǎn)間并無時(shí)間同步,因而即便總線有空閑時(shí)間,也不能保證像上述要求那樣的分布。在總線的利用率較低時(shí),掛起待發(fā)的消息將在服務(wù)間隔(intermission,縮寫為I.M.)后立即發(fā)送。這在標(biāo)準(zhǔn)中也有規(guī)定:在另一條消息發(fā)送過程中掛起待發(fā)的消息在服務(wù)間隔后的第一位啟動(dòng)(發(fā)送)。
現(xiàn)在考慮一種情況:由于電磁干擾,某消極報(bào)錯(cuò)節(jié)點(diǎn)發(fā)生一個(gè)本地錯(cuò)(其他節(jié)點(diǎn)未發(fā)現(xiàn)有錯(cuò)),它就發(fā)一個(gè)消極報(bào)錯(cuò)標(biāo)志(P.E.Flag)。因?yàn)槭请[位,其他節(jié)點(diǎn)對(duì)這個(gè)消極報(bào)錯(cuò)標(biāo)志也無響應(yīng)。這一消極報(bào)錯(cuò)幀的報(bào)錯(cuò)標(biāo)志在數(shù)據(jù)幀ACK分界符后的EOF部分得到確認(rèn)(如圖1所示),但是它的消極報(bào)錯(cuò)幀分界符(P.E.Del)延續(xù)到EOF域最后一位以及服務(wù)間隔之后。如果此時(shí)有3位的總線空閑時(shí)間,那么新幀的開始位(SOF)將是該消極報(bào)錯(cuò)節(jié)點(diǎn)服務(wù)間隔的第一位。按ISO16845標(biāo)準(zhǔn),此顯位被解讀為對(duì)超載幀的請(qǐng)求,由消極報(bào)錯(cuò)節(jié)點(diǎn)發(fā)送的超載幀將引起其他節(jié)點(diǎn)的位填充錯(cuò),使它們發(fā)送主動(dòng)報(bào)錯(cuò)幀。主動(dòng)報(bào)錯(cuò)幀與超載幀將在總線上疊合,雖然比特流的解釋對(duì)該消極報(bào)錯(cuò)節(jié)點(diǎn)和其他節(jié)點(diǎn)而言是不同的,但兩種幀分界符的結(jié)束時(shí)刻是一樣的。所有節(jié)點(diǎn)都會(huì)在此刻復(fù)位CAN協(xié)議狀態(tài)機(jī)的狀態(tài),使它回到開始服務(wù)間隔的狀態(tài)。這解釋了。BoschCAN協(xié)議的說明。但如果對(duì)3位總線空閑時(shí)間沒有保證,那又該如何呢?
對(duì)報(bào)錯(cuò)幀分界符格式錯(cuò)的檢查在國際標(biāo)準(zhǔn)化組織(ISO)的標(biāo)準(zhǔn)ISO16845中有明確的規(guī)定:在消極報(bào)錯(cuò)幀分界符中的任何顯位是一種格式錯(cuò)。第7.5.6款和8.5.13款是對(duì)應(yīng)消極報(bào)錯(cuò)接收節(jié)點(diǎn)和消極報(bào)錯(cuò)發(fā)送節(jié)點(diǎn)消極報(bào)錯(cuò)幀分界符格式錯(cuò)的測試方法,第7.6.12款和8.6.9款是消極報(bào)錯(cuò)節(jié)點(diǎn)消極報(bào)錯(cuò)幀分界符查到格式錯(cuò)時(shí),接收錯(cuò)計(jì)數(shù)器與發(fā)送錯(cuò)計(jì)數(shù)器增加機(jī)制的檢查方法。因此,消極報(bào)錯(cuò)節(jié)點(diǎn)與其他節(jié)點(diǎn)不同步時(shí),另一個(gè)節(jié)點(diǎn)開始發(fā)送新消息,其SOF將被該消極報(bào)錯(cuò)節(jié)點(diǎn)視為消極報(bào)錯(cuò)幀分界符內(nèi)的格式錯(cuò)。它將在其他節(jié)點(diǎn)新幀傳送過程中開始一個(gè)新的消極報(bào)錯(cuò)幀,新的消極報(bào)錯(cuò)標(biāo)志將在其他節(jié)點(diǎn)新幀的EOF部分得到確認(rèn),新消極報(bào)錯(cuò)幀分界符再一次延續(xù)到超過其他節(jié)點(diǎn)服務(wù)間隔之后。只要掛起的消息未發(fā)完,這一過程將不斷重復(fù)。在此時(shí)間段里,消極報(bào)錯(cuò)節(jié)點(diǎn)不能接收或發(fā)送任何消息,因?yàn)樗傇诓粩喟l(fā)送消極報(bào)錯(cuò)幀。這延遲了該節(jié)點(diǎn)應(yīng)發(fā)送的消息,而不管消息的優(yōu)先級(jí)有多高,也就引起了優(yōu)先級(jí)逆轉(zhuǎn)。由于電磁干擾的隨機(jī)性,無法對(duì)系統(tǒng)進(jìn)行調(diào)度分析。這個(gè)消極報(bào)錯(cuò)節(jié)點(diǎn)有2種可能的方式退出循環(huán)。如果在后面不斷發(fā)送的新幀的某處出現(xiàn)了主動(dòng)報(bào)錯(cuò)幀,該消極報(bào)錯(cuò)節(jié)點(diǎn)的消極報(bào)錯(cuò)幀將與主動(dòng)報(bào)錯(cuò)幀重疊,重復(fù)過程結(jié)束。但在正常應(yīng)用場合中,錯(cuò)誤是很少發(fā)生的,因此后續(xù)的傳送越正常,該消極報(bào)錯(cuò)節(jié)點(diǎn)等效離線狀態(tài)時(shí)間越長。另一個(gè)可能是經(jīng)過一些傳送后不再有掛起待發(fā)的幀,總線空閑時(shí)間足夠長,正如協(xié)議設(shè)想的那樣,能使消極報(bào)錯(cuò)幀的分界符正常結(jié)束,消極報(bào)錯(cuò)幀分界符格式錯(cuò)的重復(fù)也就此結(jié)束。
2 可能的情景
除了上述消極報(bào)錯(cuò)接收節(jié)點(diǎn)的本地故障會(huì)引起等效離線的失效以外,其他情景下消極報(bào)錯(cuò)節(jié)點(diǎn)也有可能與簇內(nèi)其他節(jié)點(diǎn)丟失狀態(tài)同步。這些情景在三方面超出了Bosch CAN協(xié)議設(shè)計(jì)時(shí)的設(shè)想:第一,不僅消極報(bào)錯(cuò)接收節(jié)點(diǎn)會(huì)丟失同步,而且消極報(bào)錯(cuò)發(fā)送節(jié)點(diǎn)也會(huì)丟失同步;第二,在有些場合,為了實(shí)現(xiàn)同步,所需的總線空閑時(shí)間要更多(至少為10位);第三,不僅消極報(bào)錯(cuò)節(jié)點(diǎn)的本地錯(cuò)會(huì)引起問題,在少數(shù)場合,主動(dòng)報(bào)錯(cuò)節(jié)點(diǎn)的本地故障也會(huì)引起問題。下面舉一些例子,實(shí)際上有問題的情景遠(yuǎn)不止這些。
在圖2中,消極報(bào)錯(cuò)接收節(jié)點(diǎn)由于電磁干擾而未能查出總線上的一個(gè)全局錯(cuò)(即漏判性質(zhì)的本地錯(cuò)),但是過后它發(fā)現(xiàn)了因其他節(jié)點(diǎn)所發(fā)送主動(dòng)報(bào)錯(cuò)幀引起的位填充錯(cuò),它發(fā)送的消極報(bào)錯(cuò)幀將遲于其他節(jié)點(diǎn)的主動(dòng)報(bào)錯(cuò)幀結(jié)束,因此丟失了同步。
在圖3中,消極報(bào)錯(cuò)接收節(jié)點(diǎn)在EOF域中發(fā)生誤判性質(zhì)的本地錯(cuò)。
它的消極報(bào)錯(cuò)幀不會(huì)被其他節(jié)點(diǎn)看到,因而它們以正常方式結(jié)束收發(fā)。消極報(bào)錯(cuò)節(jié)點(diǎn)的消極報(bào)錯(cuò)幀要遠(yuǎn)遲于其他節(jié)點(diǎn)的結(jié)束時(shí)刻結(jié)束,在此情況下,為使消極報(bào)錯(cuò)節(jié)點(diǎn)能同步,最少要有10位的總線空閑時(shí)間。當(dāng)總線有10位空閑時(shí)間時(shí),新幀的SOF會(huì)被消極報(bào)錯(cuò)節(jié)點(diǎn)看作超載幀的請(qǐng)求,盡管在超載幀結(jié)束后節(jié)點(diǎn)間實(shí)現(xiàn)了狀態(tài)同步,但卻因超載幀造成不必要的開銷。這里理想的總線空閑時(shí)間為13位。
在圖4中,由于電磁干擾消極報(bào)錯(cuò)發(fā)送節(jié)點(diǎn)未能正確讀取ACK位,它發(fā)出的消極報(bào)錯(cuò)幀將被其他節(jié)點(diǎn)看作ACK分界符和EOF域,就像消極報(bào)錯(cuò)接收節(jié)點(diǎn)一樣,它失去了與其他節(jié)點(diǎn)的狀態(tài)同步。
在圖5中,消極報(bào)錯(cuò)發(fā)送節(jié)點(diǎn)的本地錯(cuò)發(fā)生在CRC分界符處,它的消極報(bào)錯(cuò)標(biāo)志的第一位被其他節(jié)點(diǎn)的ACK位改寫,消極報(bào)錯(cuò)幀的剩余部分被其他節(jié)點(diǎn)看作ACK分界符和EOF域,狀態(tài)不同步再次發(fā)生。
在圖6中,消極報(bào)錯(cuò)發(fā)送節(jié)點(diǎn)的本地故障造成ACK分界符的誤讀,它開始一個(gè)消極報(bào)錯(cuò)幀,而其他節(jié)點(diǎn)把它誤讀為數(shù)據(jù)幀的EOF域,此時(shí)消極報(bào)錯(cuò)發(fā)送節(jié)點(diǎn)狀態(tài)與其他節(jié)點(diǎn)不同步。
當(dāng)一個(gè)規(guī)模較小的系統(tǒng)僅剩一個(gè)主動(dòng)報(bào)錯(cuò)節(jié)點(diǎn)時(shí),它的本地錯(cuò)將引起一個(gè)主動(dòng)報(bào)錯(cuò)幀。其主動(dòng)報(bào)錯(cuò)標(biāo)志會(huì)被其他消極報(bào)錯(cuò)節(jié)點(diǎn)視為位填充錯(cuò)或格式錯(cuò),從而開始它們的消極報(bào)錯(cuò)幀(見圖7)。結(jié)果是主動(dòng)報(bào)錯(cuò)幀較早結(jié)束,狀態(tài)的不同步再次出現(xiàn)。
3 后 果
當(dāng)消極報(bào)錯(cuò)節(jié)點(diǎn)出現(xiàn)上述分析的情景時(shí),就沒有機(jī)會(huì)收發(fā)消息。直到總線空閑或者有一個(gè)主動(dòng)報(bào)錯(cuò)節(jié)點(diǎn)發(fā)主動(dòng)報(bào)錯(cuò)幀時(shí),才可能恢復(fù)正常。由于錯(cuò)誤的發(fā)生是隨機(jī)事件,在正常應(yīng)用環(huán)境中其間隔會(huì)相當(dāng)長。消極報(bào)錯(cuò)節(jié)點(diǎn)逸出這種等效離線狀態(tài)的最壞情況是,它要等到總線成為空閑。此段時(shí)間為系統(tǒng)中所有消息的最壞響應(yīng)時(shí)間中最大的那個(gè)。以Tindell改造過的SAE典型試驗(yàn)數(shù)據(jù)集為例,最大最壞響應(yīng)時(shí)間在總線速率為125 kbps時(shí)為49.192ms,250kbps時(shí)為14.404ms??偩€的利用率相應(yīng)為94.2%和47.1%。如果故障發(fā)生在收發(fā)制動(dòng)壓力的消息(其周期為5 ms)的節(jié)點(diǎn),則汽車可能在125 kbps時(shí)丟失10次數(shù)據(jù),250 kbps時(shí)丟失3次數(shù)據(jù)。在此期間作用在輪子上的制動(dòng)力不是所期望的,汽車將有難以預(yù)計(jì)的風(fēng)險(xiǎn)。以每小時(shí)100 km行駛的汽車將在1.4 m或O.4 m的距離上失去控制。
消極報(bào)錯(cuò)節(jié)點(diǎn)狀態(tài)同步的丟失可能比上述最壞情況早些結(jié)束,但這完全取決于錯(cuò)誤的統(tǒng)計(jì)學(xué)特性,超出了CAN調(diào)度分析的假設(shè),使CAN設(shè)計(jì)工具不精確。當(dāng)消極報(bào)錯(cuò)節(jié)點(diǎn)丟失同步后,即使有一些未確知的總線空閑時(shí)間,它們可能引入超載幀,這也是調(diào)度分析時(shí)未加考慮的。因此設(shè)計(jì)工具難以給出有足夠精度的真實(shí)結(jié)果。這會(huì)危害到所設(shè)計(jì)系統(tǒng)的安全性。另外,超載幀也降低了總線的吞吐率。
4 解決方案
經(jīng)仔細(xì)分析所有可能的全局錯(cuò)和本地錯(cuò)以后,各種情景和合適的消極報(bào)錯(cuò)幀分界符長度間的關(guān)系就建立起來了。所謂“合適”是指消極報(bào)錯(cuò)節(jié)點(diǎn)能在出錯(cuò)后依然與其他節(jié)點(diǎn)的狀態(tài)保持同步。在有些場合中消極報(bào)錯(cuò)幀分界符應(yīng)為原來的8位長,在有些場合中它應(yīng)是2位長,在另外一些場合中它應(yīng)是1位長。若本地錯(cuò)發(fā)生在數(shù)據(jù)幀或遠(yuǎn)程幀的EOF域,那么為了實(shí)現(xiàn)正確的同步,最好的選擇是在EOF的最后一位處對(duì)CAN協(xié)議狀態(tài)自動(dòng)機(jī)進(jìn)行復(fù)位。需要根據(jù)總線上的數(shù)據(jù)流以及錯(cuò)誤發(fā)生的位置加以判斷,該消極報(bào)錯(cuò)節(jié)點(diǎn)是發(fā)生了全局錯(cuò)還是本地錯(cuò),從而確定應(yīng)有的消極報(bào)錯(cuò)幀分界符長度,或者啟動(dòng)協(xié)議狀態(tài)機(jī)的復(fù)位信號(hào),完整的解決方案已申請(qǐng)了專利。
將消極報(bào)錯(cuò)幀分界符長度簡單地改為另一個(gè)固定的長度,可能簡化實(shí)現(xiàn)的復(fù)雜性,在某些場合它可以避免在消極報(bào)錯(cuò)節(jié)點(diǎn)有本地錯(cuò)時(shí)產(chǎn)生長時(shí)間的等效離線狀態(tài)的失效,但是這一解決方案無法應(yīng)對(duì)所有可能丟失同步的情景。同時(shí)它還殘留有其他的一些缺點(diǎn):例如增加了消極報(bào)錯(cuò)節(jié)點(diǎn)不能接收的機(jī)會(huì);因重復(fù)出錯(cuò)或超載幀造成調(diào)度結(jié)果確定性的下降;本節(jié)點(diǎn)或其他節(jié)點(diǎn)所發(fā)消息優(yōu)先級(jí)的逆轉(zhuǎn);因超載幀造成帶寬的無效占用。所以這種簡化造成的性能下降是得不償失的。
按修改后實(shí)現(xiàn)的消極報(bào)錯(cuò)幀不能通過現(xiàn)有標(biāo)準(zhǔn)ISO16845第7.5.6款和8.5.13款的全部測試設(shè)置,因?yàn)橄麡O報(bào)錯(cuò)幀分界符的長度不再是固定的8位。CAN標(biāo)準(zhǔn)ISO11898及ISO16845應(yīng)依據(jù)應(yīng)用中對(duì)安全的要求作相應(yīng)的修改。
5 小 結(jié)
在消極報(bào)錯(cuò)幀分界符內(nèi)格式錯(cuò)的后果長期以來被忽視了。即使在一般應(yīng)用中等效離線狀態(tài)和優(yōu)先級(jí)逆轉(zhuǎn)也是不能容忍的,因?yàn)橐淮坞姶鸥蓴_造成的1位錯(cuò)所要承受的懲罰太大了。為了將CAN用于更為嚴(yán)格的安全攸關(guān)的應(yīng)用中,這個(gè)問題是非解決不可的。