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