楊福宇
(重慶工業自動化儀表研究所,重慶401123)
線控系統(x-by-wire)是指用電信號直接指揮電驅動器,實現控制的目的,由于信息共享容易實現、復雜的各種計算和邏輯功能可添加,可達到精確的直接或間接地控制目標。另外,由于省去液壓或及氣動能源制備系統,管線也被電纜代替,成本和重量有可能下降,減少了漏油等環境污染風險。但是由于難以實現機械后備,在可能發生安全事故時少了人為干預的手段,可信賴性全要靠系統保證,這就對系統和各組成部分提出了嚴格的要求。這種要求現在已用功能安全來表達。
飛機上采用線控系統已有較長歷史,當汽車應用線控系統時,人們往往以為它的要求低于飛機,從成本考慮,希望用較為簡單的方案來實現,現在看來很難達到目標。要從兩方面來分析。
ISO61508標準的出發點是根據事故發生的后果造成的人身、財產損失大小,以及可能發生事故的平均概率來確定功能完整性等級,即功能安全設計的目標。雖然設計目標是針對單個被控設備與相應控制裝置設定的,沒有考慮保護的系統的絕對數量,但是從人類的整體而言,筆者認為系統的絕對數量是一個需要考慮的因素,否則積累的傷害與損失會很大。從這個角度看,汽車的保有量可能是飛機的一萬倍,雖然一次飛機事故的損失可能是汽車的一千倍,但是同樣的線控系統失效概率下,汽車對社會造成的損失將是飛機的10倍。
關于汽車線控系統的功能安全要求是否比飛機低,以前筆者認為汽車在地上,大不了停下來,對功能安全的要求自然比飛機低,這是片面的理解。汽車的工作環境有其區別于飛機的地方。例如在高速公路上以100 km/h開動時,它與鄰車或路沿的距離只有1 m,一旦發生故障,偏航這1 m可能只是幾十ms的事。也就是說,可能的安全措施必須在這幾十ms內產生作用。相比之下,飛機在空中相距甚遠,即使發動機停轉,重啟在數秒內完成也沒太大問題。當然,飛機在著落時也有類似的要求。但是汽車可能連續幾小時都在這種狀態下工作,而飛機只是在起降的10 min內有這種要求,假定線控系統的平均失效概率相同,那么時長的不同使汽車就更容易出事。另外,飛機每次起飛前的檢查使出事的概率會下降很多。
從這兩點來講,可能需要投入更多的精力去研究汽車的線控技術,取得的成果也可以在飛機上使用,這為一般民用企業進入高科技行業提出一種新的可能。
線控系統加上安全措施才能實現功能安全要求,一般來說,一個系統由信號輸入,經計算處理、輸出到執行器,再經過被控對象形成閉環。如果某一環節出錯,則無法閉環,所以要加冗余,讓正常的部分繼續工作。現在計算處理部分是由微處理器完成的,由于微處理器復雜性很高,它的失效物理位置往往難以百分之百地確定,除了盡量具體追溯外,還要根據行為結果的合理性判斷錯誤是否已經發生。
為了滿足汽車線控系統的功能安全要求,一些汽車電子半導體廠家推出了專門的CPU芯片,例如Freescale的MPC5643L、TI的TMS570。它們的共同特點是采用雙核結構,鎖步運行,然后對雙核的計算結果進行比較,如果不同,就表示有一個核的中間步驟出錯了,立即通知錯誤處理單元,用戶可以在軟件中設計出錯的處理方案。
為了避免共因失效,TI的TMS570在芯片的布圖上使兩個核相互垂直,指令執行上差2個時鐘節拍。
兩種芯片對存放數據和程序的RAM、FLASH采用了錯誤校正編碼(ECC),如果有1位錯就直接校正,如果超過1個,則通知錯誤處理單元。
兩種芯片都設計了內置的自診斷單元(BIST),電源、ADC定時診斷,出錯時通知錯誤處理單元,例如MPC5643L可以每10 ms進行一次自診斷。
對于系統設計者而言,這樣的CPU雖然有兩個核,但是其工作方式表現在它的輸出上,要么是正確地輸出結果,要么是報錯而停止輸出。例如 MPC5643L[1]告訴用戶,芯片只提供失效-靜默(fail-silent)或失效-指示(fail-indication)功能。圖1把常規的單CPU結構與MPC5643L進行了比較。

圖1 兩種1oo1D結構
圖1(a)中是通常在一個CPU時為了計算可靠,常常采用指令復執的方法,幾次對同一輸入進行重復計算,選擇合理的結果作為輸出。計算的方法可以是同一程序執行幾次,直到結果相同,或者3中取2的方法,也可以采用不同的程序甚至算法,計算結果的異常則按重復出錯、出錯超時甚至應用的相關知識判斷。異常時可以阻斷輸出并報告管理部分,即實現了失效-靜默和失效-指示的功能。
圖1(b)是MPC5643L兩個核鎖步運行的情況,它把以前單核的串行復執變成了并行的復執。兩個核鎖步運行實際上只是一種擴大診斷覆蓋面的措施。當然,它加快了執行速度,減少了原來串行執行時中間結果存取可能帶來的新的出錯源。但從本質上講,它是一個1oo1D子系統。m-out-of-n代表一種冗余的硬件架構,可以實現n選m,1oo1是從一個工作通道里選出一個正確結果。
1oo1D是一個帶診斷的單通道子系統,它是沒有硬件冗余的,因為失效時靜默,所以不能提供原定的服務。對于簡單的功能,安全狀態也簡單。有了失效-指示,系統設計者就可以安排一個替代的導致安全狀態的輸出。例如,失效時關電源,或者重啟系統。汽車比較復雜,僅有失效-指示是不夠的。為了達到容許一個硬件錯,我們需要1oo2D系統,現在的可靠性和功能安全研究已經確定1oo2D系統可以達到ASID的汽車功能安全完整性最高等級,不一定需要更貴的2oo3系統。所謂1oo2D系統是指有兩個計算處理的通道,帶有診斷,有一個通道被診斷出失效時,該通道的輸出被禁止,另一個通道的輸出維持正常的功能,所以它可以容許有一個硬件錯。而用兩個MPC5643L的1oo1D系統并聯就可以構成1oo2D系統,此時,實際上的核(signal processing engine)及其RAM、FLASH已經達到4組,從經濟上講比2oo3系統已無優勢。
用1oo1D來構成1oo2D時也需要同步機制,當有一個通道出錯后,需要有一個恢復工作的機制,這里涉及功能安全應用的分類。一種應用屬于偶爾使用(on demand),例如化工對象的過壓保護,它的保護系統必須在過壓時正常工作,此時保護系統內即使遇到錯誤,也要正常工作。保護系統啟動后,對象進入安全狀態。對象要恢復正常工作,往往伴隨整個設備與保護系統的大修,或安全完整性的測試,保護系統內的錯誤被積累下來的概率很小。另一類是應用要連續工作,保護系統也要連續工作,它內部的錯誤如果不能及時消除,就有可能積累下來,從而突破1oo2D只能對付一個錯誤的極限,造成失效。
對于空間粒子轟擊或電源干擾引起的RAM和FLASH內位翻轉現象(single event upset),MPC5643L和TMS570采用了ECC編碼,可以糾正1位錯和多位錯的報錯,但是內核的保護是不足的,對于同為觸發器的內核中的寄存器可能的翻轉未有保護,這樣造成的計算出錯也許可以在1oo1D診斷中發現,但是錯誤的糾正比較困難。例如MPC5643L有兩個CPU內核e200z4,CPU中的通用寄存器GPR0~GPR31大量用于指令中的變址[2],如果出錯,則取數存數的目的地址就會出錯,這種錯誤會潛伏下來,不一定在當前輸出中反映出來,即1oo1D未必能發現這個錯誤,用現在功能安全的術語講就是殘留故障(residual fault)。當別的應用從這個地址取數時,就會南轅北轍。假如在本任務中用到這個數,即使在當前輸出中反映出來,1oo1D可以報錯,但是只有兩個內核的通用寄存器GPR的值仍無法判斷誰對誰錯,只能等待該通用寄存器的下一次刷新。然而在刷新的周期之前,很難說不會有新的錯誤發生。此時用1oo1D構成的1oo2D的兩個通道就可能同時失效了。
MCU經歷了無代碼和數據保護階段,到MC9S12P128對代碼加ECC保護的階段,再到MPC5643L對代碼和數據加ECC保護的階段,還將進入對代碼、數據和寄存器加保護的階段。實際上有人早已做了這些工作,只是現在對民用應用的安全要求不斷提高,才使這些研究顯得重要了。內核的保護可以有各種方案,例如歐洲航天局(European Space Agency)2001年完成的32位基于SPARC V8的容錯的芯片LEON[4],它對觸發器只用了3次冗余的表決方案,在不斷的時鐘刷新中,依靠表決結果,使錯誤立即被刷掉。
如果要在兩片MPC5643L構成的1oo2D系統中實現通用寄存器糾錯,理論上是有可能的,因為第一個錯誤發生時存在正確運行的一片MPC5643L,需要做的是把發生錯誤時涉及的通用寄存器內容復制過去。不過,這要求設計完整的同步機制,并考慮時間開銷是否影響性能,難度較大。
嵌入式儀表/裝置要達到的功能安全是要與應用一起考慮的,即所謂的safety instrumented system。一個儀表的安全失效概率足夠小,并不代表用它的系統就一定安全,這與用法有密切關系。不能說一個儀表是達到某安全完整性等級的儀表,甚至不能說和以前的儀表有什么不同故而叫它安全儀表,這是個基本概念,所以不宜譯為安全儀表系統。一個系統有它原來要完成的功能,現在要添加一些措施,使完成基本功能中出錯時(操作人員的錯誤、硬件失效或環境變化)仍然是安全的,要保證安全性。“instrumented”是杜撰的詞,字典里都沒有,筆者理解為借助于工具或措施,所以可以譯為保障了安全性的系統。
所有功能安全的方法目的都是在有故障時把系統導向安全狀態,硬軟件的安全完整性等級往往只考慮失效概率,而失效屬于何種性質與應用有著密切的關系,有的被劃為安全失效的部分可能實際上并不安全,所以安全狀態的確定是根本。通過從上而下的分解過程才能獲得下面子系統或部件必需的安全狀態。這里故障恢復時間也是一個重要的因素,也許非常短時間的故障沉默可以忽略不計,但這是要仔細分析以后才能判斷的,最令人擔心的是在故障沉默期間又發生新的故障,而破壞時間短可忽略不計的假設。
例如,汽車主要運送人或貨物,它的工作環境是高速公路和一般道路。在高速公路上發動機、變速箱、剎車系如發生故障,則突然停車就會有追尾的危險,在一般道路上突然加速會有追尾的危險。2010年豐田車突然加速致使人員傷亡,2013年大眾車行駛中突然失去動力,變速箱擋位顯示的“死亡閃爍”引起恐慌,這表明不安全狀態與工作環境的密切關系。這兩件事的事故原因現在尚無定論,也不在這里討論。如果突然加速,則此時的安全狀態就不是立即停車,因為有突然減速的追尾風險,在原有車速初始條件下逐漸減速可能才是安全狀態。如果發生機械故障可能傷及變速器,也不應立即進入空檔,在人與物的傷害中要兩害相權取其輕。
歷史上作為軟件工程典型案例的Therac 25放射治療儀事件[5],由于設備或操作上的意外故障,造成病人受到超劑量的照射,最終死亡。其中總結了很多系統性的軟件功能安全的必要做法,這與現在ISO61508的功能安全概念是一致的。安全狀態是每一個局部出錯時都要顧到的“綱”,綱舉才能目張。例如我們常常在程序的空閑部分添加空指令和跳轉到重啟入口的命令,以防止受干擾后程序意外跳轉,落入原有指令的半截之中,錯誤解釋構成非法循環。簡單地這樣處理是不夠的,缺少了對安全狀態的考慮,因為重啟未必是安全狀態,還必須有全部設備狀態的還原,醫療設備重啟可能要走消毒過程,可能要把消毒劑送到未退出病人的設備中甚至體內。另一方面,設備狀態還原也不一定是對病人安全的。在Therac 25案中就有4個例子重啟造成過量的例子,在那里設備與人沒有直接約束,但是主要的工作流程中積分函數-照射劑量是積分,重啟必須顧及已有的積分量,這就涉及關鍵數據的保護,斷點再入地址的保護等內容。
回到第2節討論的安全用CPU,MPC5643L對故障的響應是這樣的[3]:所有由硬件手段檢測到的錯誤(例如冗余檢查器、自檢、ECC、電壓和時鐘監視)將報告到中央故障收集和處理單元,后者將器件引導到相應的組態好的fail save狀態,防止故障擴展到系統級。它的fail-safe狀態是下述的二者之一:器件處在關斷或reset時I/O為三態;對關鍵性錯誤,輸出一個報錯信號。在正常運行和reset之間不斷切換,且不帶關斷是不算作fail-safe的。
CPU關斷時,I/O為三態可能不是系統出錯時的安全狀態,這與應用有密切的關系。子系統只是大系統的一部分,子系統故障沉默的特性只適合部分系統,而安全狀態是要子系統故障繼續工作的應用,需要更周密的設計。
[1]Freescale.Safety Manual for Qorivva MPC5643L[EB].(2013-06-24)[2014-03].http://cache.freescale.com/files/32bit/doc/user_guide/MPC5643LSM.pdf.
[2]Freescale.MPC56xx Power Architecture MCU for Automotive[EB].(2013-06-03)[2014-03],http://www.freescale.com.cn/dwf/download/MPC56xx-Power-Architeture-MCU-for-Automotive.pdf.
[3]Freescale.Qorivva MPC5643L Microcontroller Reference Manual [EB].(2013-06-03)[2014-03].http://cache.freescale.com/files/32bit/doc/ref_manual/MPC5643LRM.pdf?fpsp=1.
[4]J Gaisler.A portable and fault-tolerant microprocessor based on the SPARC v8 architecture[EB/OL].[2014-03].http://www.gaisler.com/doc/dsn2002-3.pdf.
[5]百度百科.Therac-25案例,2014.