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