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