處理CAN息線Babbling ldiot失效的方法
1 產(chǎn)生Bab bIino ldiot失效原因分析
在排除軟件設(shè)計(jì)bug后,Babbling Idiot失效主要是由硬件故障或瞬間干擾引起的。對(duì)于硬件故障造成的Babbling Idiot失效一般容易故障重現(xiàn),因此容易排障,但不能自動(dòng)消除,只有通過硬件冗余和容錯(cuò)進(jìn)行消除。對(duì)于干擾引起的Babbling Idiot失效不容易觀察,尚無好的對(duì)策。下面列舉一些可能的原因:
①CAN通信控制器硬件故障。例如接收器時(shí)鐘變壞,在重同步時(shí)超出了重同步跳躍寬度,造成數(shù)據(jù)接收錯(cuò)誤。一般這種情況通過波形測試可以發(fā)現(xiàn)。
②總線電纜連接上的故障。接插件是電子系統(tǒng)中最難保證可靠性的地方,環(huán)境溫度變化、振動(dòng)或腐蝕,連接似通似斷或電阻增大,都有可能使信號(hào)的幅度變小,或因終端阻抗不匹配而使信號(hào)波形變壞而導(dǎo)致誤讀。
③系統(tǒng)設(shè)計(jì)或人為故障。由于粗心而造成某節(jié)點(diǎn)與系統(tǒng)內(nèi)的其他節(jié)點(diǎn)物理層設(shè)置不一樣。這種情況一般很少發(fā)生,但當(dāng)網(wǎng)絡(luò)與互聯(lián)網(wǎng)相連時(shí),要考慮惡意攻擊。
④干擾引起的故障。干擾使主機(jī)死循環(huán)不斷寫消息到CAN芯片發(fā)送緩沖器,或者破壞了通信控制器內(nèi)的狀態(tài)或設(shè)置,造成不斷重發(fā)。
2 目前的解決辦法
由硬件故障引起的失效在單信道中無法加以解決,例如在連線端子處因線頭搭接或潮濕而引起的對(duì)電源或地線的短路,好像在總線上不斷地在發(fā)同一信號(hào)。這種情形只有通過冗余信道才能解決。對(duì)于電磁干擾等原因引起的Babbling Idiot失效,已經(jīng)有了一些解決方案。
2.1 利用CAN本身的錯(cuò)誤約束機(jī)制
在發(fā)送過程中出現(xiàn)了出錯(cuò)幀,發(fā)送器自己也發(fā)出錯(cuò)幀,根據(jù)標(biāo)準(zhǔn)規(guī)定,發(fā)送器的發(fā)送錯(cuò)計(jì)數(shù)器就加8。在重發(fā)中如仍不能糾錯(cuò),就要繼續(xù)重發(fā),經(jīng)過16次重發(fā),發(fā)送器進(jìn)入消極狀態(tài)(error passive),32次后該節(jié)點(diǎn)就進(jìn)入離線狀態(tài)(bus off)。在這32次重發(fā)中,若有更高優(yōu)先級(jí)的消息在該節(jié)點(diǎn)成功發(fā)送,那么進(jìn)入離線的重發(fā)次數(shù)可略有增加。
CAN本身的錯(cuò)誤約束機(jī)制可使Babbling Idiot失效只持續(xù)一段時(shí)間,這對(duì)大部分非安全應(yīng)用是夠了,但對(duì)安全攸關(guān)的應(yīng)用是不夠的。32次重發(fā)造成的對(duì)低優(yōu)先級(jí)消息的阻撓,在總線速率為500 kbps、幀長為95位時(shí),相當(dāng)于6 ms;對(duì)時(shí)速為100 km/h的車來說,相當(dāng)于有O.17 m不受控制。離線狀態(tài)是節(jié)點(diǎn)Babbling Idiot失效的一個(gè)結(jié)果,但這并不是Babbling Idiot失效的最壞結(jié)果。由于CAN系統(tǒng)內(nèi)的優(yōu)先級(jí)機(jī)制和出錯(cuò)傳遞機(jī)制,當(dāng)故障是由接收方面引起時(shí),這種約束方法會(huì)錯(cuò)怪了發(fā)送器。例如,位時(shí)間錯(cuò)誤的接收節(jié)點(diǎn)總會(huì)使發(fā)送一接收過程失敗,它可能會(huì)使很多節(jié)點(diǎn)進(jìn)入離線狀態(tài),即在CAN總線系統(tǒng)中由一個(gè)節(jié)點(diǎn)失效擴(kuò)大為系統(tǒng)失效。
2.2 Buja等提出的方法
用一個(gè)總線監(jiān)守控制CAN通信控制器向驅(qū)動(dòng)器的輸出,在要發(fā)消息前由主機(jī)的應(yīng)用程序向總線監(jiān)守發(fā)申請(qǐng),以讓該消息在總線有空時(shí)競爭發(fā)送??偩€監(jiān)守到一定時(shí)間后禁止通信控制器向驅(qū)動(dòng)器的輸出,這個(gè)時(shí)間取調(diào)度分析得到的該消息的最壞響應(yīng)時(shí)間。這種方法就是給每條消息提供一個(gè)合法的允許發(fā)送的時(shí)間窗口,與一般時(shí)間觸發(fā)通信協(xié)議里用的辦法一樣,不過這里是由主機(jī)的通知來開啟窗口。
這種方法的缺點(diǎn)是:在防止Babbling Idiot錯(cuò)的同時(shí),也限制了CAN的正常出錯(cuò)自動(dòng)重發(fā)功能;否則會(huì)將一般出錯(cuò)自動(dòng)重發(fā)看作Babbling Idiot錯(cuò),造成誤判。普通錯(cuò)形成的丟幀必須在中間層或應(yīng)用層加以處理,這使處理復(fù)雜化,增加了時(shí)間與軟硬件的開銷。
另外,總線監(jiān)守的實(shí)現(xiàn)還是比較復(fù)雜的,因?yàn)樗仨氃诮邮諣顟B(tài)時(shí)及時(shí)打開不同長度的窗口,讓通信控制器發(fā)出認(rèn)可信號(hào)或出錯(cuò)幀。這就要求通信控制器與總線監(jiān)守增強(qiáng)互動(dòng)。理論上要求總線監(jiān)守與通信控制器盡量相互獨(dú)立(例如獨(dú)立的電源、獨(dú)立的時(shí)基和獨(dú)立的放置空間),以免總線監(jiān)守和通信控制器受到相同的故障影響。而這些要求由于互動(dòng)而不易全部實(shí)現(xiàn)。如果在總線監(jiān)守中另設(shè)CAN的接收器,則可以去掉總線監(jiān)守和通信控制器之間的連接,但是總線監(jiān)守內(nèi)的接收與通信控制器內(nèi)的接收是否一致還無法保證。在同一節(jié)點(diǎn)里發(fā)送不同ID消息時(shí),主機(jī)還要將消息的ID通知總線監(jiān)守,因?yàn)椴煌琁D的消息最壞響應(yīng)時(shí)間是不同的。而這一過程中還有可能出錯(cuò),若要檢驗(yàn),那么其實(shí)現(xiàn)方法又添加新的不確定因數(shù)。
2.3 Broster等提出的方法
Broster方法與Buja方法的區(qū)別是:總線監(jiān)守單獨(dú)偵聽總線上的消息流,預(yù)設(shè)一個(gè)時(shí)間窗口,以此判斷是否發(fā)生Babbling Idiot錯(cuò);然后告知相關(guān)節(jié)點(diǎn)并禁止其發(fā)送,而無需節(jié)點(diǎn)提出消息發(fā)送的請(qǐng)求。因此,理論上一個(gè)總線監(jiān)守可以對(duì)很多節(jié)點(diǎn)進(jìn)行保護(hù),只要相應(yīng)的連線不嫌累贅。對(duì)每一個(gè)偶發(fā)消息,它有一個(gè)最小到達(dá)時(shí)間間隔T,以S表示消息發(fā)生時(shí)刻,用Si+1Si代表二次連續(xù)的到達(dá)時(shí)間,就有:
如果條件(1)不滿足,則可判定發(fā)生了Babbling Idiot錯(cuò)。然而在總線上觀察到的只是一連串的消息實(shí)際到達(dá)時(shí)間E1,E2,…,Ei,Ei+1,另外已知的是由調(diào)度分析得到對(duì)每一個(gè)消息的最壞響應(yīng)時(shí)間R。顯然E應(yīng)發(fā)生在Si和Si+R之間。Broster等構(gòu)造了一個(gè)Si的預(yù)估值Gi,如果Ei不在Gi和Gi+R之間,就認(rèn)為發(fā)生了Babbling Idiot錯(cuò)(參考文獻(xiàn)只考慮了Gi≤Ei的判斷,未考慮Ei≥Gi+R超時(shí)錯(cuò))。Gi的求法甚為關(guān)鍵,為理解的方便,以下根據(jù)參考文獻(xiàn)的推理過程對(duì)符號(hào)下標(biāo)進(jìn)行了一致性改寫。在Ei沒有發(fā)生Babbling Idiot錯(cuò)的假設(shè)下,即Gi≤Ei≤Gi+R時(shí):
①在最壞響應(yīng)的情況下Si的估計(jì)值是ESi=Ei-R,若實(shí)際上有Ei一R>Gi,就說明Gi的估計(jì)偏小(Gi小于ESi),應(yīng)該以ESi+T作為下一次消息發(fā)生時(shí)刻的估計(jì)值,即Gi+1=Ei一R+T;
②沒有出現(xiàn)最壞響應(yīng)的情況時(shí),Ei—R≤Gi,可以以Gi+T作下一次消息發(fā)生時(shí)刻的估計(jì)值,即Gi+1=Gi+T;
二者合并,就得到參考文獻(xiàn)中的公式:
在G0=-R的初值下,假設(shè)的2個(gè)不等式都成立(參考文獻(xiàn)中為Gi=∞,只考慮了第一個(gè)不等式)。
這種用時(shí)限的方法與Buja方法一樣,限制了CAN的正常出錯(cuò)自動(dòng)重發(fā)功能,否則會(huì)將一般出錯(cuò)自動(dòng)重發(fā)看作Babbling Idiot錯(cuò)而誤判。
由于參考文獻(xiàn)僅考慮了Ei≤Gi的為BabblingIdiot錯(cuò)判斷準(zhǔn)則,然而總線監(jiān)守本身受干擾有錯(cuò)也會(huì)使Gi偏大,從而造成誤判。式(2)對(duì)偏小的Gi進(jìn)行糾正,對(duì)偏大的Gi則無糾正設(shè)計(jì),一直產(chǎn)生另一類超時(shí)錯(cuò)誤。用市售CAN通信控制器時(shí),作為接收節(jié)點(diǎn),總線監(jiān)守在聽到以錯(cuò)誤幀結(jié)束的發(fā)送時(shí),是無法判斷該消息的ID的。按照Broster的設(shè)計(jì),總線監(jiān)守在聽完消息ID之后,就應(yīng)進(jìn)行是否有Babbling Idiot錯(cuò)的判定;另外,如果在仲裁區(qū)發(fā)生錯(cuò)誤,也不得不放棄本次判斷與處理,否則會(huì)累及無辜。這不僅需專門的硬件實(shí)現(xiàn),也有可能已經(jīng)放過了Babbling Idiot錯(cuò)。
2.4 有源星形耦合器方案
CAN的有源星形耦合器結(jié)構(gòu)比較復(fù)雜,它要求每個(gè)節(jié)點(diǎn)與耦合器有一根上行通道和一根下行通道。通過對(duì)2個(gè)通道數(shù)據(jù)流的差異可以分析出有固定搭接于顯位或隱位的錯(cuò)誤,并把該節(jié)點(diǎn)從系統(tǒng)中切除。對(duì)Babbling Idiot失效只考慮了其特例bit flipping錯(cuò),bit flipping錯(cuò)是指比特流不受限制地變化。參考文獻(xiàn)認(rèn)為當(dāng)節(jié)點(diǎn)壞了,或節(jié)點(diǎn)的出錯(cuò)計(jì)數(shù)器增減已不按CAN規(guī)定動(dòng)作,或連線有了故障時(shí),就會(huì)出現(xiàn)這種情況。通過比較上行通道與下行通道在傳送出錯(cuò)幀時(shí)的情況,可判斷出每個(gè)節(jié)點(diǎn)的貢獻(xiàn),按照類似于CAN的出錯(cuò)計(jì)數(shù)器增減法則記錄在BFC中,然后根據(jù)BFC確定是否切除該節(jié)點(diǎn)。例如,別人都送er-ror flag時(shí)該節(jié)點(diǎn)未送,若在該節(jié)點(diǎn)發(fā)的error flag中又有錯(cuò),再或該節(jié)點(diǎn)發(fā)了error flag而別人都沒發(fā)等情況,均可通過這種辦法把壞了的節(jié)點(diǎn)切除。
這種方案把危險(xiǎn)集中到有源星形耦合器,使它成為失效孤點(diǎn)(single point of failure)。為了解決此問題,需要增加備份有源星形耦合器,這樣一來,它要比總線情況多達(dá)8倍的收發(fā)器,多達(dá)4倍的通信控制器,以及有源星形耦合器內(nèi)的其他部件,成本增加太多。另外,通過對(duì)出錯(cuò)情況分析來處理漏網(wǎng)的壞節(jié)點(diǎn),其覆蓋面有多大尚不清楚。
3 對(duì)干擾引起B(yǎng)abbljng idiot失效的分析
干擾可能使節(jié)點(diǎn)的主機(jī)進(jìn)入程序跑飛與死循環(huán)狀態(tài),主機(jī)不斷要求發(fā)送特定的消息,造成Babbling Idiot失效的問題。這種問題不應(yīng)由通信系統(tǒng)負(fù)責(zé)解決,因?yàn)橥ㄐ畔到y(tǒng)無法區(qū)別這是否是正確的請(qǐng)求,只有高層協(xié)議可通過數(shù)據(jù)中的其他信息決定數(shù)據(jù)的取舍。但此時(shí)在信道上數(shù)據(jù)已經(jīng)重復(fù)傳送,帶寬已被侵占。
因?yàn)閷?duì)Babbling Idiot失效因果關(guān)系的直接觀察很少,我們只能分析所有可能的因果關(guān)系,找出最有可能的原因,然后加以驗(yàn)證和提出解決方案。在數(shù)據(jù)傳送過程中,由于電源或其他信道電纜的傳導(dǎo)或幅射干擾電平的影響,會(huì)使數(shù)據(jù)出錯(cuò)。根據(jù)參考文獻(xiàn)的實(shí)踐,電源的瞬間跌落會(huì)傳遞到器件的直流電源,因此也可能引起保存在RAM中的設(shè)置數(shù)據(jù)變化。通信控制器內(nèi)有幾種不同的數(shù)據(jù),干擾影響的結(jié)果是不同的。
3.1 不產(chǎn)生Babbling Idiot失效的情況
干擾使主機(jī)寫通信控制器時(shí)幀的ID、長度或數(shù)據(jù)等變了,幀的格式?jīng)]有錯(cuò),這種情況就通信而言,不會(huì)感到有錯(cuò),只是有一次未發(fā)或錯(cuò)發(fā)了的幀。在通信控制器輸出的過程中干擾會(huì)使比特流發(fā)生錯(cuò)誤,CAN的出錯(cuò)自動(dòng)重發(fā)機(jī)制可以糾正此類錯(cuò)誤。通信控制器內(nèi)有限自動(dòng)機(jī)的狀態(tài)被干擾破壞會(huì)引起比特流發(fā)生錯(cuò)誤,CAN的出錯(cuò)自動(dòng)重發(fā)機(jī)制可以糾正此類錯(cuò),因?yàn)槌鲥e(cuò)重發(fā)時(shí)有限自動(dòng)機(jī)的狀態(tài)就復(fù)位了。干擾破壞了部分通信控制器內(nèi)寄存器的內(nèi)容(例如發(fā)送出錯(cuò)計(jì)數(shù)器、接收出錯(cuò)計(jì)數(shù)器、狀態(tài)寄存器的某些位),有些不會(huì)造成直接的錯(cuò)誤。有些寄存器(例如掩蔽位寄存器、過濾位寄存器)會(huì)影響正常接收,但不會(huì)造成Babbling Idiot失效,而有的通信控制器則可能造成Babbling Idiot失效。例如,若82527中2條消息的ID在掩蔽位寄存器的必須匹配位上沒差別就會(huì)使高編號(hào)的消息體無休止發(fā)送;如果干擾使掩蔽位寄存器的必須匹配位發(fā)生變化,就有可能出現(xiàn)上述情況。但是這種重復(fù)發(fā)送并不伴有錯(cuò)誤幀。
3.2 產(chǎn)生Babbling ldiot失效的情況
某些設(shè)置的改變會(huì)造成通信系統(tǒng)內(nèi)物理層參數(shù)的不一致,例如對(duì)時(shí)鐘、位時(shí)間、位極性的設(shè)定。它們?cè)诓煌耐ㄐ趴刂破魇遣煌?,例?2527有組態(tài)寄存器,而SJAl000沒有對(duì)應(yīng)的功能寄存器。物理層的不一致是造成Babbling Idiot失效的重要因素,這不在CAN協(xié)議設(shè)計(jì)的錯(cuò)誤約束機(jī)制的覆蓋范圍之內(nèi)。
當(dāng)發(fā)送器與接收器的位時(shí)間不同時(shí),出錯(cuò)是不可避免的,重發(fā)不會(huì)改變接收器的采樣情況,但接收仍然會(huì)再次錯(cuò),這就是說造成了Babbling Idiot失效的故障。在一個(gè)時(shí)刻只有一個(gè)發(fā)送器,但可以有多個(gè)接收器,因此接收器故障造成出錯(cuò)的概率更大。
位時(shí)間快的接收器可能會(huì)發(fā)現(xiàn)假的bit stuffing錯(cuò)。由于采樣時(shí)間的錯(cuò)誤,采到的值會(huì)出錯(cuò),所以CRC值也是錯(cuò)的,它不會(huì)發(fā)送Acknowledge,但在按其時(shí)鐘的EOF部分發(fā)送active error flag。如果由它產(chǎn)生的出錯(cuò)幀被別的節(jié)點(diǎn)識(shí)別,就會(huì)產(chǎn)生新的重疊的error flag,發(fā)送節(jié)點(diǎn)也因此而執(zhí)行發(fā)送錯(cuò)計(jì)數(shù)器加8的操作,在Babbling Idiot失效過程中很快進(jìn)入消極狀態(tài)。如果在重發(fā)中有其他節(jié)點(diǎn)更高優(yōu)先級(jí)消息的發(fā)送,這個(gè)高優(yōu)先級(jí)消息由于同樣的理由也會(huì)出錯(cuò)。每次出錯(cuò)所有接收節(jié)點(diǎn)的接收錯(cuò)計(jì)數(shù)器加1,而這個(gè)時(shí)鐘錯(cuò)的接收節(jié)點(diǎn)由于是第一個(gè)發(fā)active errorflag的,所以它的接收錯(cuò)計(jì)數(shù)器加8,因此會(huì)較早進(jìn)入消極狀態(tài)。在這種情況下,Babbling Idiot失效的后果受CAN故障約束,會(huì)持續(xù)一段時(shí)間長。如果受影響的發(fā)送節(jié)點(diǎn)原來已處于消極狀態(tài),那么這個(gè)錯(cuò)誤的接收節(jié)點(diǎn)就可以將它送入離線狀態(tài)。如果這個(gè)發(fā)送節(jié)點(diǎn)的發(fā)送錯(cuò)計(jì)數(shù)器離256不遠(yuǎn),則有可能將更多的發(fā)送節(jié)點(diǎn)送入離線狀態(tài),這樣就有可能引起系統(tǒng)的失效。
對(duì)位時(shí)間慢的接收器也可能會(huì)發(fā)現(xiàn)假的bit stuffing錯(cuò)和CRC錯(cuò),它的active error flag總能為其他節(jié)點(diǎn)識(shí)別。除了上述位時(shí)間慢的接收器出現(xiàn)的現(xiàn)象外,active errorflag還可能造成error flag在正常位時(shí)間下有延長到errordelimiter區(qū)的14位連續(xù)顯位的錯(cuò),使出錯(cuò)概率加大。對(duì)于發(fā)送器出現(xiàn)位時(shí)間錯(cuò)的情形,發(fā)送器快相當(dāng)于接收器慢,發(fā)送器慢相當(dāng)于接收器快,所以其討論與上面是一樣的。
4 可能的解決辦法探討
第2節(jié)中討論的幾種方法著眼于Babbling Idiot失效在時(shí)間上的表現(xiàn),但是僅考慮傳送時(shí)無出錯(cuò)重發(fā)的情況,所以難于應(yīng)用。從干擾對(duì)形成Babbling Idiot失效的機(jī)理分析來看,故障節(jié)點(diǎn)會(huì)在較短時(shí)間內(nèi)形成很多斷斷續(xù)續(xù)的出錯(cuò)幀,這與普通的出錯(cuò)重發(fā)時(shí)偶爾出現(xiàn)的出錯(cuò)幀情況有些區(qū)別。下面由此提出幾種解決方案:
①在主機(jī)中統(tǒng)計(jì)一定時(shí)間內(nèi)通信控制器出錯(cuò)的次數(shù),如果超限就對(duì)通信控制器的時(shí)間設(shè)置重新進(jìn)行初始化。這種方法如何解決82527掩蔽位寄存器變化帶來的Babbling Idiot失效,尚待進(jìn)一步研究。
②局部改進(jìn)通信控制器的設(shè)計(jì),對(duì)于常用的標(biāo)準(zhǔn)通信速率,將有關(guān)的設(shè)置固化,或減少其選擇,僅利用引腳的狀態(tài)來決定參數(shù)。當(dāng)位時(shí)間同步誤差超大時(shí)產(chǎn)生中斷,以便主機(jī)重新進(jìn)行初始化。
③改進(jìn)通信控制器設(shè)計(jì),將有關(guān)物理層的設(shè)置部分放在非易失性存儲(chǔ)器中,可較徹底地解決抗Babbling Idiot失效問題。今天這在技術(shù)與經(jīng)濟(jì)上都已不成問題。
④對(duì)主機(jī)死循環(huán)造成的Babbling Idiot失效可以在發(fā)送前設(shè)檢查位,此檢查位確定消息發(fā)送的時(shí)間間隔,只要此間隔大于看門狗周期,就能避免此類失效。
結(jié) 語
本文與以前解決Babbling Idiot失效問題的思路不同。以前主要是阻止Babbling Idiot故障節(jié)點(diǎn)對(duì)系統(tǒng)內(nèi)其他正常通信帶寬的影響(即容錯(cuò)),而本文試圖消除故障本身,減少失效擴(kuò)大化的可能,即糾錯(cuò)。這種方法完全植根于CAN種種查錯(cuò)與錯(cuò)誤通知機(jī)制以及出錯(cuò)重發(fā)機(jī)制,是CAN獨(dú)有的。有些事件觸發(fā)通信協(xié)議,底層不具備這種錯(cuò)誤通知機(jī)制,實(shí)現(xiàn)上效率就比較低。在許多時(shí)間觸發(fā)協(xié)議中,依靠總線監(jiān)守可以防止消息在非規(guī)定時(shí)間的發(fā)送,應(yīng)付Babbling Idiot失效比較有效。但它沒有考慮物理層設(shè)置或調(diào)度時(shí)間表的被干擾,總線監(jiān)守本身也有可能被干擾。消息出錯(cuò)依然存在,在更高層次的出錯(cuò)重發(fā)還在無效地占用帶寬;而且這種錯(cuò)誤在時(shí)間上要延續(xù)很久才會(huì)被發(fā)現(xiàn),在那里要解決這種類型的錯(cuò)幀失效問題就沒有CAN那樣簡單。