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