關(guān)于CAN隱患的爭辯
摘要 對于在《單片機(jī)與嵌入式系統(tǒng)應(yīng)用》上發(fā)表的關(guān)于CAN隱患的2篇文章,Bosch對比作出了答復(fù)。Bosch在聲明中默認(rèn)了故障約束機(jī)制會造成發(fā)送與接收延遲現(xiàn)象的存在,但未提及其帶來的惡性后果;強(qiáng)調(diào)這樣做的好處,稱這是特色而不是錯(cuò)誤。本文在分析等效離線或真正離線對應(yīng)用帶來壞處的基礎(chǔ)上,說明此事的嚴(yán)重性——可能引起大規(guī)模的召回事件。故障約束機(jī)制的好處與壞處是可以分開的,改進(jìn)CAN不僅在現(xiàn)在是必須,也可進(jìn)一步提高CAN在未來應(yīng)用中的競爭力。
關(guān)鍵詞 CAN 故障 安全 故障約束機(jī)制
關(guān)于CAN隱患的爭辯始于本刊發(fā)表的2篇文章,一是“CAN總線系統(tǒng)中的一種安全隱患”,一是“CAN消極報(bào)錯(cuò)發(fā)送節(jié)點(diǎn)變?yōu)殡x線狀態(tài)的故障“。這2篇文章在送稿前已經(jīng)發(fā)給國內(nèi)外的一些專家征求意見,尚未有反駁的意見。由于此事關(guān)系重大,涉及許多單位的利益,例如芯片供應(yīng)商、開發(fā)工具供應(yīng)商、ECU供應(yīng)商、汽車制造商、高層協(xié)議供應(yīng)商、高層協(xié)議產(chǎn)品提供商、各類服務(wù)提供商等等,為了避免這些單位由于既得利益的驅(qū)動有意無意地淡化問題的嚴(yán)重性,需要一個(gè)獨(dú)立的代表第三者利益的機(jī)構(gòu)來考察與評判問題是否存在,及其危害性。這個(gè)第三方利益就是終端用戶,例如汽車的駕駛與乘用人員、行人及與此有關(guān)的保險(xiǎn)公司、道路管理單位等。因此,不僅應(yīng)該告知CAN產(chǎn)業(yè)的有關(guān)方,也應(yīng)告知利益有關(guān)方,才能得到正確的恰如其分的應(yīng)對。基于此種考慮,筆者將2篇文章的英文稿送美國國家交通部公路交通安全管理處(U.S.Department of Transportation,National Highwav Traffic Safety Administration)的網(wǎng)絡(luò)熱線,提請他們注意。后來這件事大概由他們轉(zhuǎn)到了國際標(biāo)準(zhǔn)化組織(ISO)。ISO的TC/22/SC3負(fù)責(zé)車用通信有關(guān)業(yè)務(wù),其TC/22/SC3/WG1/TF1的組長是CiA的主席Zeltwanger先生。CiA曾有人作了回復(fù),筆者也作了答復(fù),最后由 Zeltwanger。先生轉(zhuǎn)來對此問題的正式聲明作為答復(fù)。這是對問題的答復(fù),并不是對個(gè)人的答復(fù),這個(gè)聲明是由ISO中國CAN專家組轉(zhuǎn)來的。(它的英文全文見本刊網(wǎng)站www.mesnet.com.cn。)下面是Bosch聲明要點(diǎn)與筆者的觀點(diǎn),在引述Bosch聲明時(shí)將力求準(zhǔn)確。
Bosch聲明的標(biāo)題是“它不是隱患,而是特色”(It's not
a bug,it's a feature!)。在引用參考文獻(xiàn)[1—2]時(shí)說,“在那2篇文章中有一些對CAN協(xié)議故障約束機(jī)制,特別是對由消極報(bào)錯(cuò)狀態(tài)下看到本地錯(cuò)的關(guān)切?!?在CAN總線上網(wǎng)絡(luò)流量很高以致連續(xù)幀之間不再有空閑時(shí)間時(shí),以及消極報(bào)錯(cuò)節(jié)點(diǎn)看到本地錯(cuò)(即未被其他節(jié)點(diǎn)看到的錯(cuò))時(shí),它將無法完成其消極報(bào)錯(cuò)標(biāo)志。后果是這個(gè)節(jié)點(diǎn)將不再能收發(fā)幀,直到它遇到空閑時(shí)間或其他節(jié)點(diǎn)發(fā)的主動報(bào)錯(cuò)幀。消極報(bào)錯(cuò)狀態(tài)的發(fā)送節(jié)點(diǎn)會由此而使出錯(cuò)計(jì)數(shù)器加上去,直到達(dá)到離線狀態(tài)?!?這是CAN協(xié)議故意要達(dá)到的行為?!?種方法企圖解決的是1個(gè)并不存在的問題?!?br /> 上述引述與原文略有差異。總線上空閑的分布是不受控制的,尖峰負(fù)載也是不可控的,即使有部分空閑也不能保障消極報(bào)錯(cuò)幀正確結(jié)束。尖峰負(fù)載是由消息到達(dá)時(shí)間的本質(zhì)決定的,事件觸發(fā)消息的到達(dá)時(shí)間是隨機(jī)的,周期性消息的到達(dá)時(shí)間隨本地時(shí)鐘而變。例如,有2個(gè)初始相位相差5 ms的消息,它們的振蕩器相差200×lO-6,它們的相位差在25 s后就消失了。在某個(gè)公倍數(shù)時(shí)間點(diǎn)上,所有的消息就會有接近O的相位差,就形成CAN調(diào)度分析最壞響應(yīng)時(shí)間時(shí)假定的最壞峰值負(fù)載。這種差異不影響對 Bosch聲明的進(jìn)一步分析。就聲明的上述表述而言,“特色”、“故意要達(dá)到的行為”等語句實(shí)際上同意了等效離線和真正離線后果的存在,后面還有 Bosch對此行為的直接描述。不過,Bosch并不認(rèn)為此后果是有害的,而是強(qiáng)調(diào)此后果的有利方面。
它說:“故障約束機(jī)制的目的是防止有故障的節(jié)點(diǎn)干擾其余節(jié)點(diǎn)間的通信?!比缓蠼忉屃诉M(jìn)入消極報(bào)錯(cuò)狀態(tài)或離線狀態(tài)就可以達(dá)到上述目的。并說“1個(gè)因REC而進(jìn)入消極報(bào)錯(cuò)狀態(tài)的接收節(jié)點(diǎn)在成功收到1個(gè)無錯(cuò)的消息后,它能切換回主動報(bào)錯(cuò)狀態(tài)(見故障約束規(guī)則8),使它能至少再發(fā)1次主動報(bào)錯(cuò)幀?!痹谡?wù)摽偩€負(fù)載應(yīng)小于50%后,它說“尖峰負(fù)荷典型地是由總線上的擾動造成,此時(shí)通信要中斷一段時(shí)間,待發(fā)的傳送會累積起來。當(dāng)擾動結(jié)束時(shí),所有這些待發(fā)的消息將按它們的標(biāo)識符一個(gè)接一個(gè)送出?!绻麛_動是由有故障節(jié)點(diǎn)引起,并在節(jié)點(diǎn)進(jìn)入消極報(bào)錯(cuò)狀態(tài)結(jié)束,那么故障約束機(jī)制想要的功能是把該節(jié)點(diǎn)保持在消極報(bào)錯(cuò)狀態(tài),至少讓被該干擾推遲的所有消息發(fā)完,即尖峰負(fù)荷結(jié)束。
在這里,尖峰負(fù)荷并不隨著干擾的消失而消失,CAN作為一種事件觸發(fā)協(xié)議,負(fù)荷的分布完全是隨機(jī)的,50%負(fù)載的約束并不能防止等效離線或真正離線狀況的出現(xiàn),參考文獻(xiàn)[1]中引述的例子已證明了這一點(diǎn)。Bosch把引入消極報(bào)錯(cuò)狀態(tài)的好壞后果混為一談。當(dāng)節(jié)點(diǎn)進(jìn)入消極報(bào)錯(cuò)狀態(tài)后其報(bào)錯(cuò)幀全是隱位,本來可以不再干擾其他節(jié)點(diǎn)的正常通信,沒有必要讓它退出通信。此外,在這一段表述中可以清楚地看到,CAN故障約束機(jī)制要讓被該干擾推遲的所有消息發(fā)完,至少要禁止消極報(bào)錯(cuò)狀態(tài)節(jié)點(diǎn)發(fā)送(不管消極報(bào)錯(cuò)狀態(tài)節(jié)點(diǎn)待發(fā)的消息優(yōu)先級多高),這印證了參考文獻(xiàn)[1-2]的分析,但是它未提及接收也被禁止了。
現(xiàn)在大家都認(rèn)識到引入消極報(bào)錯(cuò)狀態(tài)是一個(gè)積極的措施,對此并無異議。而bosch只看到故障約束機(jī)制設(shè)計(jì)的有利方面,未注意到它在幀同步上造成通信服務(wù)缺失的后果。在聲明中對此只字未提。那么通信服務(wù)缺失的后果是否是一個(gè)故障或bug?這應(yīng)該由用戶根據(jù)其對應(yīng)用是否有害來確定,并不能因把它稱為“特色”而改變。進(jìn)一步研究表明存在后果嚴(yán)重的可能性?;镜木€索是:車內(nèi)存在嚴(yán)重的電源傳導(dǎo)干擾(ISO7637干擾類型D→CAN收發(fā)器在電源跌落時(shí)CANH— CANL差減少,會有寫“0”讀回“1”的bit錯(cuò)→CAN協(xié)議發(fā)現(xiàn)錯(cuò)后發(fā)報(bào)錯(cuò)幀的規(guī)定(即能重復(fù)發(fā)報(bào)錯(cuò)幀)→CAN協(xié)議在報(bào)錯(cuò)標(biāo)志中發(fā)現(xiàn)bit錯(cuò)時(shí)出錯(cuò)計(jì)數(shù)器+8的規(guī)定。一個(gè)較長時(shí)問跌落就可以將節(jié)點(diǎn)推入消極報(bào)錯(cuò)狀態(tài)(消極報(bào)錯(cuò)狀態(tài)并非罕見)。然后一次本地故障把它推入失去服務(wù)能力的狀態(tài)。CAN總線失去服務(wù)后對應(yīng)用的危害的仿真已有文章報(bào)道,如在彎道上的外沖或急轉(zhuǎn)。而故障約束機(jī)制設(shè)計(jì)上的這個(gè)bug是造成這一危險(xiǎn)的因素中的關(guān)鍵一環(huán)。
失去服務(wù)能力的后果破壞了實(shí)時(shí)控制應(yīng)用的基礎(chǔ)——正時(shí)性(timeliness)?,F(xiàn)在許多應(yīng)用只容許少量數(shù)據(jù)的丟失,而且能容許數(shù)據(jù)丟失的應(yīng)用已經(jīng)考慮了消息的冗余,若要考慮這樣長時(shí)間的失去服務(wù)能力,數(shù)據(jù)的冗余就要多得更多,這將顯著增加總線上的流量。要考慮這個(gè)bug,又要符合Bosch的50%的限制,使應(yīng)用進(jìn)入更加為難的境地。
安全標(biāo)準(zhǔn)IEC61508、EN50159將在汽車行業(yè)推行,在執(zhí)行這類標(biāo)準(zhǔn)時(shí)要從可靠性角度作故障的危害與風(fēng)險(xiǎn)分析。由于一個(gè)小故障會引起一個(gè)元件出錯(cuò)或失效,元件的錯(cuò)或失效造成部件出錯(cuò)或失效,然后造成子系統(tǒng)出錯(cuò)或失效,從而造成更上一層系統(tǒng)出錯(cuò)或失效。必須分析清楚這個(gè)鏈并研究其出錯(cuò)或失效的概率,才能判斷這個(gè)最原始的錯(cuò)是否會對安全構(gòu)成威脅。CAN的這個(gè)故障是引起系統(tǒng)失效的一個(gè)非常典型的故障。在一般通信系統(tǒng)中,一個(gè)本地錯(cuò)引起1幀的丟失,如該應(yīng)用上可容忍,失效的后果到此為止。然而CAN的這個(gè)故障有可能引起100個(gè)左右不同接收幀的丟失。不僅如此,它使該節(jié)點(diǎn)的所有幀都暫時(shí)不能發(fā)送,也就是說會影響到其他的控制系統(tǒng)的功能。例如,對CAN總線掛上ECU節(jié)點(diǎn)的不同方案,不能發(fā)送發(fā)動機(jī)轉(zhuǎn)速信號就會影響變速器、ABS、ASR、空調(diào),輪速信號不能發(fā)送就可能影響電噴、變速器、ASR,變速比信號不能發(fā)送就會影響到電噴、ASR、廢氣再循環(huán),含有網(wǎng)關(guān)的儀表板單元不能正常發(fā)送可能引起發(fā)動機(jī)不能點(diǎn)火。也就是說,由一個(gè)本地故障轉(zhuǎn)為一個(gè)節(jié)點(diǎn)失效,然后又轉(zhuǎn)為若干個(gè)功能失效。有些功能的失效會影響能耗或排放,或使設(shè)備運(yùn)行不平穩(wěn),但有的功能會影響制動和轉(zhuǎn)向。
CAN總線失去服務(wù)能力會導(dǎo)致控制系統(tǒng)的失效。車輛是一個(gè)運(yùn)動的物體,控制系統(tǒng)的失效會變?yōu)檫\(yùn)動的失控,從而引起安全問題。這對所有人都是沉重的壓力,采取審慎與觀望的態(tài)度是符合情理的,但如果CAN失去服務(wù)能力的過程存在,這個(gè)后果是回避不了的。
Bosch對惡性后果并未提及,這表示他們并未意識到這一點(diǎn)。參考文獻(xiàn)[1]提到,這一等效離線或真正離線的開始源于消極報(bào)錯(cuò)狀態(tài)節(jié)點(diǎn)的消極報(bào)錯(cuò)幀沒有足夠的時(shí)間結(jié)束。但可能的情景遠(yuǎn)超過Bosch在CAN2.O規(guī)范中的描述,如果他們原來就已知有如此多的情景,就會把這些情景都包括在CAN2.O中。他們也沒有提醒過作調(diào)度分析工具軟件的人們,由于任何優(yōu)先級的消息在此隱患發(fā)作時(shí)都失去服務(wù)能力,且進(jìn)入消極報(bào)錯(cuò)狀態(tài)不是罕見的事,那么調(diào)度的效果就很小了 ——木桶的底是漏的,其余板長短的影響已退居次要地位甚至失去意義。bug影響了工具理論基礎(chǔ)的完整性,調(diào)度的結(jié)果不能保證,就不能最終保障控制功能的實(shí)現(xiàn)。網(wǎng)上尚未見到Bosch有任何關(guān)于節(jié)點(diǎn)因故障約束機(jī)制設(shè)計(jì)而推遲收發(fā)的類似這次聲明的報(bào)道。因此,由于未充分預(yù)計(jì)到故障會引起如此壞的后果,只能說這是一個(gè)bug。
實(shí)際上,消極報(bào)錯(cuò)狀態(tài)下出現(xiàn)壞后果及失去服務(wù)能力的毛病是可以克服的。參考文獻(xiàn)[1]提出了2種方法,也是Bosch聲明提到的2種方法。其實(shí)還存在其他可能的解決方案,例如將消極報(bào)錯(cuò)幀分界符內(nèi)的顯位不視為錯(cuò)而視為超載幀的請求。此時(shí)經(jīng)超載幀與其他節(jié)點(diǎn)的報(bào)錯(cuò)幀重合,可以使消極報(bào)錯(cuò)狀態(tài)節(jié)點(diǎn)迅速和其他節(jié)點(diǎn)取得同步,但這樣做犧牲了超載幀占用的帶寬,并使其他節(jié)點(diǎn)蒙受一次出錯(cuò)的不白之冤。所以參考文獻(xiàn)[1]提出的是較好的方案。在保持引入消極報(bào)錯(cuò)狀態(tài)的優(yōu)點(diǎn)時(shí)不必死抱
它的缺點(diǎn)。失去服務(wù)能力的問題得以避免,由于這個(gè)因素造成的對CAN消息負(fù)載率的限制也可減少,這樣對大多數(shù)人都有好處。
已有的大量CAN應(yīng)用,特別是那些現(xiàn)場條件較好,本身并非安全攸關(guān)的應(yīng)用(即使在汽車內(nèi),也有許多節(jié)點(diǎn)與安全關(guān)系不大),對CAN隱患的討論不要恐慌,只需對自己的環(huán)境和應(yīng)用作評估,必要時(shí)補(bǔ)充作些測試即可。
對CAN隱患的討論并不是要全面否定CAN。盡管CAN尚有其他問題與不足,甚至較為嚴(yán)重的問題,但它仍然是當(dāng)前最好的協(xié)議。CAN最突出的優(yōu)點(diǎn)是出錯(cuò)自動重發(fā)功能。很久以來,關(guān)于事件觸發(fā)協(xié)議與時(shí)間觸發(fā)協(xié)議孰優(yōu)孰劣的討論中人們傾向于認(rèn)為時(shí)間觸發(fā)協(xié)議更為可靠,后者更適用于線控系統(tǒng)。但是研究表明,由于出錯(cuò)自動重發(fā)功能的存在,CAN的消息不正確概率比重復(fù)送2次消息的TTCAN小幾個(gè)數(shù)量級。有理由相信時(shí)間觸發(fā)的其他協(xié)議也會在類似的比較中顯得遜色,除非它們采用更為復(fù)雜的上層糾錯(cuò)措施。上述bug使CAN的這一巨大性價(jià)比優(yōu)勢變得無用,所以對CAN進(jìn)行改進(jìn)是非常有價(jià)值的?,F(xiàn)在誰作改進(jìn),誰就能解決當(dāng)前的急需,也就有機(jī)會在未來勝出,這是一個(gè)重新洗牌的機(jī)會。這一爭辯由于Bosch的聲明而使事情變得明朗,國際國內(nèi)對此作出自己的結(jié)論的時(shí)間已經(jīng)同步。
綜合上述分析,筆者依然認(rèn)為它是一個(gè)隱患。對我國IC、ECU、整車廠來說,必須加以重視并及時(shí)采取行動。決策是一個(gè)博弈的過程,落后將動搖消費(fèi)者的信任,導(dǎo)致十分被動的境地。