作者:楊福宇 這樣細節的討論對沒有花力氣讀過CAN原理的人可能比較吃力。為此簡單介紹一下CAN的幀結構:CAN的幀由頭部的仲裁域、控制域、數據域、CRC校驗和、認可域和幀結束部分(EOF)構成。仲裁域主要是消息的標識符,不同優先級的標識符同時出現在總線上時,優先級最高者勝出,就按幀的剩余部分繼續發送,而競爭失敗者停止發送,轉為接收者?刂朴騼扔4位,決定數據域的字節數。 CAN幀的查錯措施中對發生在控制域的位錯是靠EOF的設計實現的。其原理是規定填充位規則只管到CRC結束處,而EOF部分為連續的7個1。當控制域發生位錯時,原來傳送的幀長被誤讀,產生了變形的幀。如果變形幀長于原幀,那么原幀的EOF部分將落到變形幀的數據域或CRC域,由于EOF部分破壞了數據域或CRC域的填充位規則,接收節點就查到錯,在EOF第6位處發報錯幀。如果變形幀短于原幀,那么接收節點會在期待的EOF部分收到原幀的數據或CRC,就不會有連續的7個1,接收節點就會發現不滿足ACK分界符或EOF部分的格式錯,從而在EOF的任一個位置(查到錯后的一位)發報錯幀。由于這種機制,不但有接收錯的節點不會產生錯收,也保證了系統內所有節點的一致性。 但是當有第二個位錯時,這一機制存在漏洞。圖1中發生在傳送EOF第5位的1如果有位錯,那么EOF部分和數據部分的區別就不再存在。變形幀就存在漏檢的可能性。就可以理解為收到了有填充位的數據F1,或者由于正在送數據F1的填充位時出了錯,被理解為收到了期待的EOF。 圖1數據流和EOF部分發生誤解的條件 圖2是DLC由0111變為0011的例子(DLC2傳送中由1變為0),長幀讀為短幀:圖2 DLC2傳送中由1變為0時幀的變化 此時原幀的第6個數據字節具有圖1中F1的值,其填充位在傳送中出錯變為1,從而使變形幀讀為Ack+EOF,格式是符合標準的。對任意H*D1D2D3總存在一種C1*C2*,它滿足CRC檢驗及其分界符的格式檢驗,所以出現變形幀通過CRC檢驗的概率是2-16。對D6即F1來講,只要前7位為0111111,就能保證接收節點在填充位傳送出錯時EOF的格式檢驗通過(因為CAN規定接收節點的格式檢驗只到EOF第6位)。所以F1出現的概率是2-7。7字節的幀,11位標識符可能有2個填充位,自DLC1到CRC結束共73位,可能含18個填充位,幀長最多為119位,原幀二位錯發生位置的組合有119*118/2=7021種,所以發生在DLC2及D6填充位處錯的概率為1/7021=1.4*10-4。這一情形下的漏檢概率為Pun=2-16*2-7*1.4*10-4=1.69*10-11。 節點收下變形幀后,如果有新幀發送,它會干擾其它節點對原幀的收發,從而引起報錯,但是這種后果已經影響不到該節點已經收下的幀。 這種漏檢的情況還有;數據由6字節變到2字節(DLC2傳送中由1變為0),Pun=1.69*10-4*2-23;數據由8字節變到0字節(DLC3傳送中由1變為0)Pun=1.21*10-4*2-23;數據由4字節變到0字節(DLC2傳送中由1變為0),Pun=2.55*10-4*2-23?偟腻e幀漏檢率為Pun=8.1*10-11,僅此一項,它已經大于Bosch聲稱的漏檢率4.7*10-11,所以不要迷信外國。 說到迷信,從字面上講,就是自己不動腦子,只要是權威說的就不加思考地接受了,這當然省事,因為有了事可以推托:外國人也是這樣的,我們水平低,能不錯嗎?這樣的態度無異于認為我們是****。我認為為了把我們的事做好,每個數據都應審核一下,也許過去沒有發現錯,才辦了錯事,那確實是當時認識水平不夠。但今天已經給你指出了問題,就不要再推托了。 現在國際上在推行汽車的功能安全標準ISO26262,那么對于以前已經被安全認證過的東西,是否要因為新發現了有安全漏洞而推翻呢?我認為功能安全的概念中有重要的一條,即功能安全存在于整個產品的設計、生產、維修生命周期中。新發現有錯表示原來的安全指標分解過程有錯,不能被確認(Validation)了,自然要重新確認,否則搞什么認證和確認都是假的了,只留下粉刷現實的印記而已。希望管事的人不要葉公好龍。 現在談談CAN FD:這是2011年Bosch推出的可變速率的CAN升級版本,它仍然聲稱在安全性方面錯幀漏檢率是4.7*10-11。 Total residual error probability for undetected corrupted messages: less than message error rate * 4.7 * 10-11. 但是在它的二種速率交替時,會有慢速讀取高速位流而出錯的情況,形成第3種錯幀漏檢機制。詳見:楊福宇,“有關CAN FD的評論“,《單片機與嵌入式系統應用》,2012, No.7,p.34-36,40 。它在實質上與本文是一樣的,第二個錯造成誤讀為EOF。CAN FD在DLC的值大于1000之后定義的幀長變化是大于4的,所以長幀讀為短幀出現的情況要多許多,同樣可用上述方法分析。只是因為幀長加大,二位錯發生位置的組合數變得很大,從這個角度使第三種錯幀漏檢率降下來。 |