作者:楊福宇 由于掌握了錯幀重構的規律,所以可以說,你想怎樣錯就可以構造出怎樣錯的幀。 圖1是一個數值被放大的例子,其中U= x8+x7+x6+x5+x4+1, Ec=U*G= (1000, 0010, 0001, 1100, 1110, 1001)。Tx1可以是以前連續5個0之后的填充位。也可以解釋為DLC0,例如原來是有3字節的數據,送一個0000010000…的值,結果錯幀變為1000010000…的值,錯幀將值放大了32倍。 圖1 錯幀將數值放大32倍 觀察圖1的重構過程可見,如果將Ec7取為1,那么Tx7=0,錯值倍數更大(為64倍),如果繼續將Ec8取為0,那么Tx8=0,錯值倍數更大(為128倍)…。我們可以由修改后的Ec重新求Uh,例如為了達到128倍,由Ec=1000010,將Ec除以CAN的生成多項式G=(1100,0101,1001,1001),便可以得到Uh=(xk xk-1 xk-2 xk-3 xk-4 xk-5)。此時對照5種可能的Ut,我們可以選k-4=5,即第3種Ut。得到U=x9+x8+x7+x6+x5+x4+1,Ec=U*G= (1000, 0100, 1001, 0111, 0111, 0100,1)來重構出可疑數據流,如圖2。因為算出的Ec9正好是0,且Rx7由于有填充位設為1,所以實際的放大倍數達到264倍。當然選其它Ut也是可以的,不過可疑數據流的位數稍多1位。 圖2 錯幀將數值放大264倍 同樣的多項式U= x8+x7+x6+x5+x4+1, Ec=U*G= (1000, 0010, 0001, 1100, 1110, 1001)。也可使值縮小32倍,如圖3。 圖3 錯幀將數值縮小32倍 在應用中數值的變化可能引起應用功能的錯誤,例如在變速器換檔或剎車時,希望油門暫時減少,但是結果是加大,甚至可能全開。在豐田突然加速事件中,我是懷疑VSC經CAN傳送到節氣門的信號可能出錯。美國的NASA調查報告并未排除使節氣門開大的可能性。見文(2)。當然,并非一次傳送錯就會錯到底,但是CAN存在短暫一段時間失效的可能性,這在我以后的博文中會交待。 這種錯幀漏檢之后跟著失效一段時間的危害是很大的,例如你在超車,你的轉向角是5度,但是電動助力轉向單元經CAN傳到ESP的角度是30度,那么ESP認為這是駕駛員的命令,協助你實現30度轉向,CAN接著的幾十毫秒失效,以及人不可能在幾十毫秒內及時反應,你的車就可能沖到逆向車道了。 如果希望證實特定的數據變化,例如Tx=10100101是否可能變為Rx=01011010,我們只要由這二項比較得到Ec=11111111,將這個片斷加上頭部Ech,然后求出滿足的多項式U,和以前的例子一樣重構出Tx。不過,由于存在Ec的頭部、尾部為特定形式的限制,這個可疑數據流不一定在你希望的位置,只有幀比較長時,幀的部分片斷可以如愿重構。 錯幀漏檢的另一種危險是數據的相移,例如,你的幀內有許多表示狀態和控制命令的開關量,一旦移相,狀態和命令就亂了,有些保障措施也會失效,例如原來規定55表示開,AA表示關,可以抵御有干擾時形成的非法碼,現在由于移相,55/AA就會互相轉換;靵y的狀態和命令會產生設計時未預計到的系統狀態,導致系統失控。 那么應用上有沒有辦法化解這一問題?對于這樣的值域錯唯一的辦法是某種型式的冗余:軟件上的冗余、物理上的冗余或時間上的冗余。 軟件上的冗余就是另加數據的補充CRC,例如加一個8位CRC,這個CRC和原來的CAN的CRC沒有共同的質多項式,此時可把漏檢率縮小256倍,這樣的結果還是達不到Bosch原定的指標。由于要占去一字節,在原來已用掉8字節數據的場合就比較麻煩:一幀要分為二幀。這都會增加帶寬要求。其次是為取得不同接收節點的一致性,它們都要知道別人是否發現有附加CRC錯,就要等有沒有NACK,這要添加新的規定:例如必需在什么時限內發出NACK;NACK的形式(否定哪個幀)。時限的引入也產生了延遲。 為了對付一個漏檢的錯幀,應用上的冗余要付出代價的,例如: 1。原來用二個物理通道,只要有一個通道“正確”收到了就可以了,F在由于所謂“正確”可能是錯的,當二個通道結果不一致時,你無法斷定誰是真正正確的。就必須要有二個通道的第二次傳送結果,在假定連續二次都發生錯幀漏檢概率小到可忽略不計的情況下,就可以以二次結果相同的通道作最終決定的輸出。這樣,通信需要的帶寬要加倍,CAN本來已為了減少競爭,把總線利用率定得較低,如30%~40%,這樣做,有效負載降到只有15~20%。你為了滿足余下的需求,要增加一套新的CAN系統,或者忍痛割愛,把控制閉環的采樣周期加大,降低帶寬需求,但也導致性能下降。 2。原來一個物理通道時,你需要至少送3次才能作出表決。此時帶寬的需求增到3倍,比上一條一樣面臨必須付出的代價。 3。用對象輸出變化的已知極限,攔截漏檢的錯幀,有時不可行。例如Audi方向盤角度傳感器G85到ESP的信號本來應該識別0-2000°/S,這相當于40°/20ms,那么用攔截方案,變化超出40°就限值,但是由于傳送值不是增量,方向盤角減少后的值(比上次采樣小40°)在CAN傳送中變大且被限值(比上次采樣大40°),誤差被限在80°,仍然是嚴重錯誤。 4。接連多個采樣值后作各種濾波,就像一般的抑制信號中干擾所取的辦法,越是想抑制輸入的干擾,就越要減少當前輸入的權重。但這種辦法完全不適用,因為原來的噪音只是信號范圍的1%或更小,現在的錯誤值可能是信號范圍的80%。要想抑制錯幀,就會減少當前輸入的權重到非常小,此時產生多個周期的延遲,就連累正常輸入也有這樣的延遲。若不想延遲,就要加快采樣,把占用的帶寬增加,而且不能完全消除錯幀的影響。 這些方法顯然會增加成本,增加重量、能耗,使設計、生產和維修變得困難,同時應用的性能仍然有可能下降。 這樣的措施只能是克服困難的暫時性的不得已而為之的措施。就好比肚子餓的時候,先填飽肚子再說,饑不擇食。我們總不能一直這樣吧,因為這樣總在付出別的代價。每一個人在作決擇的時候總會有得有失,只是有的人看得遠點,未雨綢繆,在長時間的刻度上損失小,有的人看得近點,只能委曲求全。不能說誰更高明,因為這只是目標函數的不同,約束條件的不同。而高明不高明往往是對約束條件的認識上的差別,有人認為做得到的事有人認為做不到。有人認為自己做不到,別人也做不到。有人認為自己做不到,也想不到去請別人來做,如此等等,諸葛亮的運籌帷幄,全在于他的審時度勢,否則難有赤壁之勝,三國鼎立的局面。 有人會認為這是危言聳聽,最好有實驗數據來證實。這是非常樸素的實證觀念,在簡單的物理系統中常常是這樣做的。但是在可靠性分析上,往往無法作這樣的實驗,把小概率的事件來作實驗會非常費時間,就像文(6)講的用軟件注入求錯幀漏檢率會需要天文數字的時間。而像現在要求的功能安全要求的更小的概率,基本上只能用分析的方法。所以只能用分析的方法判斷以前的分析有無錯漏,而不可能以有限的實驗的方法來判斷以前的分析有無錯漏。 |