王逸凡,朱帥琦
(中國航發(fā)控制系統(tǒng)研究所,江蘇 無錫 214063)
數(shù)字控制系統(tǒng)在航空航天等高安全性領域已經(jīng)得到了廣泛應用[1],控制軟件的功能和復雜度不斷增加,軟件研發(fā)中引入的缺陷也越來越隱蔽,因此導致的異常中斷定位就顯得尤為重要[2-5]。目前,對基于PowerPC的控制軟件,需要依賴編譯生成的.map文件和源碼進行異常中斷定位[6-10],雖然定位準確,但該方法只適用于開發(fā)調試場景下的異常定位。由于軟件源碼和編譯生成的.map文件涉及到軟件的設計信息,軟件作為產(chǎn)品交付時,一般不會提供源碼和編譯過程文件。因此,現(xiàn)有的定位方式給外場用戶進行快速異常定位帶來不便。
此外,隨著數(shù)控軟件更新頻率不斷提升,一個數(shù)控系統(tǒng)常常存在多個軟件版本,維護成本大大增加。對于各個版本發(fā)生的異常中斷,想要快速定位異常就完全依賴于內場開發(fā)人員的管理水平和反應速度,使用者在外場沒有快速定位的手段和能力。
本文針對使用PowerPC的發(fā)動機控制軟件,結合NVRAM的存儲特性[11-14],設計了一種簡易輕量化的異常中斷定位及數(shù)據(jù)存儲方案??梢栽跊]有源碼和編譯文件的情況下,對發(fā)生中斷的模塊進行定位,對異常發(fā)生時的控制狀態(tài)進行記錄,簡化了定位方法,方便外場使用。
嵌入式軟件運行前,會在系統(tǒng)初始化時,對異常中斷進行初始化,設置中斷源。CPU在運行過程中一旦發(fā)生異常,就會中止處理器正常的執(zhí)行,跳去執(zhí)行異常處理程序。異常有多種類型,異常本身是中斷的一種特例。本文介紹的PowerPC有19種異常中斷,如表1[15]所示。
表1 異常及觸發(fā)條件
當上述異常被觸發(fā)后,軟件的中斷服務函數(shù)進入對應的異常處理程序,此時可以利用串口打印異常號及相關寄存器中的信息。目前,異常中斷定位是將異常運行時代碼位置、異常種類等信息打印出來,然后通過相應的.map文件查詢異常發(fā)生的函數(shù)位置,從而實現(xiàn)異常定位。
異常中斷后軟件一般會馬上進行復位,通過串口打印出來的信息,有時候很難被PC端的使用者和機載設備捕捉到,偶發(fā)性的異常在復位后容易被忽視。同時,已交付產(chǎn)品一般不提供源碼和.map文件,無法根據(jù)串口信息進行快速異常定位,給外場分析帶來不便。
通過研究異常中斷過程,當異常發(fā)生后,軟件會跳轉到異常中斷服務函數(shù)中,中斷發(fā)生后會馬上跳出主程序。此時,如果將跳出位置記錄下來,就可以不依賴.map文件對異常進行定位,從而捕獲異常。
本文設計了一個異常數(shù)據(jù)標記函數(shù),標記函數(shù)能夠直接訪問NVRAM進行讀寫操作,并將標記信息記錄到指定地址。此外,宏定義一系列表征軟件運行位置的標記作為函數(shù)入?yún)?申請一片NVRAM空間用來存儲異常信息。軟件正常運行時,進入每個模塊前都會先進行標記,同時覆蓋NVRAM中上一個模塊的記號。因為標記函數(shù)是在進入模塊前進行標記,因此當異常中斷跳出主程序時,NVRAM中存儲的標記就是異常中斷發(fā)生的模塊位置,如圖1所示。此外,結合異常中斷服務函數(shù),可以將產(chǎn)生異常的種類、異常中斷發(fā)生次數(shù)、發(fā)生異常時軟件狀態(tài)信息等,也存儲在NVRAM中。
圖1 異常中斷定位方式
由于異常中斷后一般會進行復位,控制軟件重新初始化運行。通過上述方式捕獲異常中斷后,要保證之前的異常中斷信息能夠保存下來,且需要多個相同大小的NVRAM空間,每次異常中斷后,都對異常信息的存儲位置進行偏移,寫滿后循環(huán)覆蓋。在有限的空間下,只記錄最近發(fā)生的幾次異常中斷信息,可記錄的異常次數(shù)取決于分配的NVRAM空間大小。
對于異常中斷信息,還需要通過上位機進行解析,有兩種查看方式:
(1)有監(jiān)視上位機的情況下,將異常中斷位置及其他異常信息傳輸給上位機,通過監(jiān)視上位機對異常信息進行顯示。
(2)對于裝機狀態(tài),可在產(chǎn)品離線后,下載NVRAM數(shù)據(jù),使用上位機解析回看近幾次的異常中斷位置及其他異常信息。
針對該PowerPC的19種異常中斷,可以通過軟件和硬件的方式進行觸發(fā)。這里以除零異常,即IVOR33-浮點數(shù)運算異常為例,對初始化和周期任務中的異常中斷定位進行插樁驗證。
對于初始化過程,借助NVRAM進行插樁。當軟件運行到插樁代碼時,先從NVRAM讀取提前設置好的插樁代碼的激活碼。當軟件初始化到插樁位置時,先將NVRAM中該激活碼置為無效,然后運行插樁代碼觸發(fā)異常,如圖2所示。
圖2 利用NVRAM的插樁驗證過程
采用這種觸發(fā)方式的好處是,當軟件在初始化過程中由于異常中斷復位后,下次可以正常初始化,避免軟件因為插樁導致異常而不斷復位。此時,上位機會顯示上一次異常中斷發(fā)生的位置,與.map文件查詢結果一致,并且顯示中斷號為33。下載NVRAM的數(shù)據(jù),可以查看到異常發(fā)生的模塊、異常中斷類型等詳細信息。
對于周期任務,通過上位機指令激活插樁代碼的方式觸發(fā)異常??刂栖浖诎l(fā)生異常中斷后復位,復位后將上次發(fā)生的異常模塊及其他信息通過串口傳輸給上位機顯示。上位機顯示的異常中斷位置與.map文件查詢的異常中斷函數(shù)位置一致,并且顯示中斷號為33。在不同位置多次注入異常,下載NVRAM數(shù)據(jù),可以查看近幾次發(fā)生異常的模塊及異常發(fā)生前控制軟件的運行狀態(tài)。
以上插樁驗證結果證明,本文設計的異常中斷定位方案有效。對于不便提供源碼和編譯文件的場景,可以采用本文設計的方案,作為工程試驗現(xiàn)場對控制軟件異常中斷定位的替代方案。
本文設計的方案主要是針對沒有源碼、沒有.map文件的控制軟件異常中斷進行定位,是對開發(fā)端現(xiàn)有異常中斷定位方法的補充。本文利用標記函數(shù)結合NVRAM對異常模塊進行標記,模塊可以是一個函數(shù),也可以是功能集,顆粒度可以根據(jù)代碼規(guī)模、硬件速度和時間余度等因素靈活設計。通過該方案,控制軟件發(fā)生異常中斷時,能夠將異常定位并記錄下來,在不依賴.map文件的情況下,通過上位機方便快捷地為用戶提供異常中斷信息。本文通過人為注入異常的方式,驗證了上述方案的可行性和正確性。