林海,趙昶宇
嵌入式系統軟件調試和固化方法研究
林海1,趙昶宇2
(1.海軍裝備部駐天津地區第二軍事代表室,天津 300308;2.天津津航計算技術研究所,天津 300308)
嵌入式軟件調試和固化已經成為軟件開發過程中不可或缺的一部分,嵌入式軟件調試環境為嵌入式軟件的調試和固化提供了廣闊便利的發展空間。闡述了嵌入式軟件的常用調試工具、調試方法和固化方法,并給出了嵌入式軟件調試和固化的經驗,對嵌入式軟件的開發調試具有指導意義。
嵌入式系統;軟件調試;調試工具;軟件固化
嵌入式軟件的調試和固化是嵌入式軟件開發過程中非常重要的組成部分,軟件開發人員在源代碼設計完成后,需要在指定的硬件平臺上進行調試、驗證,最終形成目標碼后對軟件產品進行固化,軟件設計人員對軟件調試、固化過程和經驗技巧進行充分了解,可以在很大程度上提高工作效率,避免出現低層次質量錯誤。
由于目前嵌入式軟件調試平臺種類很多,按照開發調試環境可劃分為具有集成開發調試環境的仿真器調試平臺、簡易的監控調試平臺、黑盒調試平臺以及集成交叉開發環境四大類。
軟件設計人員可以在集成仿真環境下進行源代碼的編譯、鏈接、生成目標文件,與目標機建立聯系后,可動態加載目標文件執行,靈活設置斷點、觀測變量、訪問內存、寄存器、跟蹤打印調試信息。近年來發布的主流處理器都支持仿真器調試,如TI的C3X系列、C5X系列、C6X系列,AD公司的TS201、0MAP、ARM系列等處理器都有完善的集成仿真調試環境。
對于386EX芯片,利用系統提供的編譯程序進行編譯連接生成目標文件,在386EX提供了監控調試環境下,主機和目標板通過RS-232串口建立通訊關系,軟件開發人員可以進行目標文件的在線加載,在源程序中插樁加入斷點的方式進行調試,可以在進入斷點后,觀測寄存器和程序執行狀態。
對于早期開發的8051、80196系列的芯片,部分產品只能在黑盒環境下進行軟件調試,軟件設計人員可以在源程序中進行插樁,加入相關的調試信息,通過監測口進行調試。
對于X86、PPC、ARM、MIPS系列的處理器芯片,軟件開發人員可以在Tornado/WorkBench集成開發環境下進行軟件調試。一般在宿主機上進行程序的編制和編譯,調試、測試和執行則需要將編譯好的目標文件下載和鏈接到運行著嵌入式實時操作系統的目標機上,宿主機和目標機之間通過串口或者以太網接口進行通信。軟件開發人員可以借助Tornado/WorkBench自帶的調試器配合目標機共同完成對被調試程序執行狀態的實時跟蹤,從而快速有效地對程序錯誤進行定位、糾正,提高調試效率。
在Tornado/WorkBench集成開發環境下,常用的調試和測試工具有:①內存分析工具。用于處理動態內存分配中存在的缺陷。當動態內存被錯誤分配后,通常難以再現,可能導致失效難以跟蹤,使用內存分析工具可以避免這類缺陷進入功能測試階段。但該工具可能會對代碼的性能造成很大影響,從而嚴重影響實時操作。②性能分析工具。該工具會提供有關的數據,說明執行時間是如何消耗的,是何時消耗的,以及每個例程所用的時間。性能分析工具不僅能指出哪些例程花費時間,而且與調試工具聯合使用可以引導開發人員查看需要優化的特定函數,性能分析工具還可以引導開發人員發現在系統調用中存在的錯誤以及程序結構上的缺陷。③GUI測試工具。GUI測試工具可以作為腳本工具在開發環境中運行測試用例,其功能包括回放操作記錄、抓取屏幕顯示供以后分析和比較、設置和管理測試程序。很多嵌入式設備沒有GUI,但常常可以對嵌入式設備進行插樁來運行GUI測試腳本。該工具可以節省功能測試和回歸測試的時間。 ④覆蓋分析工具。一般在代碼的調試和測試時可以使用代碼覆蓋工具跟蹤哪些代碼被執行過,分析過程可以通過插樁來完成。覆蓋分析工具提供有關功能覆蓋、分支覆蓋和條件覆蓋信息。對于嵌入式軟件來說,代碼覆蓋分析工具可能侵入代碼執行過程,影響實時代碼運行。
按照軟件產品“先編程后焊接”和“先焊接后編程”兩種生產順序,嵌入式軟件的固化方法分為兩種:采用編程器(如ALL-11)離線編程的方法進行軟件固化,采用在線編程(仿真環境、監控軟件、交叉調試)的方法進行軟件固化。
對于不具備在線固化條件的表貼芯片,需在芯片焊接到板卡之前,由設計人員從產品庫中提取目標碼文件進行固化,采用編程器(如ALL-11)進行離線燒寫固化。先編程后焊接采用的編程器具有支持芯片廠家、覆蓋面較廣、人機交互界面友好、功能完善(提供了文件上傳和下載、芯片擦除、編程、校驗、數據比較)、固化可靠性強等優點,操作人員可利用編程器在離線模式下安全可靠地固化軟件。由于在對產品進行開蓋和換芯片處理后才能采用編程工具進行離線編程,因此“先編程后焊接”的方法不利于產品的后期維護,一般在生產階段使用。
對于支持集成仿真調試環境和在線編程的產品,操作人員首先將JTAG/MPSD專用插頭接到目標板的專用插座上,在主機和目標機建立通訊后,在仿真器的集成調試環境下,操作人員可以利用部分芯片的集成開發環境提供的編程工具或軟件人員編寫的專用固化程序進行軟件目標碼的在線固化。在對產品進行開蓋后才能在仿真器的集成調試環境下進行在線編程,因此“仿真環境”編程的方法不利于產品的后期維護,一般在產品調試階段使用。
產品監控軟件是為產品研制的專用在線燒寫軟件,操作人員根據產品的具體特點,采用編程器/仿真環境固化的方法將產品監控軟件的目標碼燒寫到芯片內部的指定空間,確保產品上電后處理器首先運行的是監控軟件。
利用產品的專用接口電纜在產品和主機監控軟件之間建立通訊關系,一般通過串口、1553B接口、USB接口、以太網等接口交互命令信息和數據信息,在產品不開蓋的條件下,實現產品軟件的在線更新和監控軟件的自更新功能。自主開發的主機監控軟件可在產品不開蓋條件下進行軟件在線固化,很大程度上提高了產品的可維護性,一般在產品的維護階段使用。
對于運行在嵌入式操作系統VxWorks中的軟件,由于嵌入式操作系統安裝在CF卡/CFast卡/SATA硬盤中,固化該類軟件產品時只需軟件開發人員在Tornado/WorkBench下編譯完的軟件的*.o或者*.out文件拷貝到CF卡/CFast卡/SATA硬盤中即可。當VxWorks操作系統啟動后,系統自動加載并執行*.o或者*.out文件,即可運行該嵌入式軟件。
3.1.1 仿真環境
在仿真器配套提供的集成仿真環境下,調試過程需要注意以下事項:建議在加載程序運行前,先將CPU進行軟復位,以確保CPU在初始態;在軟件加載完成運行后,不要在Watch Window窗口頻繁刷新相關變量的值,否則會導致程序中斷異常,建議在程序進入斷點后再觀察變量和寄存器的值;頻繁調用“printf語句”將會導致中斷丟失。
3.1.2 監控環境
不同軟件產品的RAM地址分配不盡相同,軟件設計人員必須了解監控軟件占用的RAM地址空間。在軟件產品的CMD文件進行地址空間分配時進行充分考慮,否則會引起地址沖突,導致不可預知的運行結果。
3.1.3 黑盒環境
黑盒環境下通常采用軟件源代碼插樁的方式調試軟件,通過在源代碼中增加“調試代碼”來監控軟件的執行狀態。
3.1.3.1 分析產品硬件系統,確認調試接口
可利用硬件產品的備用RS-422/RS-232串口作為調試接口和測試設備自帶的串口接口連接,測試設備端用“串口調試助手”接收調試信息;若硬件產品沒有備用RS-422/RS-232串口,可依據產品的實際接口配置,將產品的RS-422串口、開關量輸出接口或DA輸出接口作為調試接口和專用測試設備的相關接口連接,并在測試設備軟件中編寫“接收調試”的代碼。
3.1.3.2 在產品軟件源代碼中進行插樁調試
不建議在源碼編寫完成、目標碼固化后直接進行軟件調試,應按照先簡后繁的順序分別進行調試;在源代碼中進行插樁,應針對每個條件分支輸出不同的監控信息。
3.1.4 交叉鏈接環境
3.1.4.1 任務監控
在VxWorks操作系統中使用taskIdListGet()函數可以獲得當前操作系統中運行的所有任務,TaskStatusString獲取任務狀態名稱,在發現任務出錯時通過回調函數通知用戶出錯任務情況。
3.1.4.2 任務堆棧溢出
在VxWorks操作系統中通過taskInit()函數指定堆棧的內存地址到一塊只讀頁的下方,然后運行taskActivate()函數,若有堆棧溢出,會出現MMU異常報錯。此外還可通過checkStack()命令來檢查任務的堆棧情況。
3.1.4.3 異常任務定位
在VxWorks操作系統任務執行過程中出現異常時,可通過執行函數tt()顯示指定任務的函數調用關系,根據函數調用關系確定當前異常任務所處的位置,并查找異常原因。
在仿真環境下,建議軟件人員在產品固化流程執行完成后,不要使固化程序的代碼執行處于未知的狀態,應加入空循環語句,斷開仿真器連接,固化程序繼續執行的情況下不會導致程序跑飛,出現不可預知的結果;在仿真器集成環境和監控軟件進行軟件固化時,應確保固化過程中不對產品進行斷電操作,確保軟件固化成功。
[1]李志丹.嵌入式軟件調試方法研究[J].計算機與數字工程,2012,40(7):157-159.
[2]溫平川,何先剛,殷茜.嵌入式軟件調試器的設計與實現[J].西南師范大學學報(自然科學版),2003,28(2):209-213.
2095-6835(2020)10-0029-02
TP311.5
A
10.15913/j.cnki.kjycx.2020.10.011
林海(1976—),男,本科,海軍裝備部駐天津地區第二軍事代表室工程師,主要從事裝備質量監督與檢驗驗收方面的工作。
〔編輯:嚴麗琴〕