朱艷,林廣棟,黃光紅
(中國電子科技集團(tuán)第38研究所,合肥 230088)
Eclipse開源代碼的多核DSP調(diào)試系統(tǒng)集成
朱艷,林廣棟,黃光紅
(中國電子科技集團(tuán)第38研究所,合肥 230088)
提出了一種集成多核DSP調(diào)試系統(tǒng)的應(yīng)用軟件開發(fā)環(huán)境。該開發(fā)環(huán)境基于Eclipse的開源代碼,針對多核DSP的多核并行特性,對CDT/DSF框架進(jìn)行了改造和擴(kuò)展,為面向多核DSP應(yīng)用的開發(fā)人員提供了一個可靠、快速、兼容單核及多核模式的軟件開發(fā)環(huán)境,提高了多核并行開發(fā)的速度和質(zhì)量。
DSP;Eclipse;多核調(diào)試
DSP是一種用于數(shù)字信號處理的專用處理器。在電子技術(shù)很多領(lǐng)域,例如雷達(dá)、聲納、語音通信、數(shù)字通信等,正廣泛使用DSP處理器搭建的系統(tǒng)來處理日益龐大的數(shù)字信息。為了解決計算能力需求與功耗增加之間的矛盾,DSP的設(shè)計正在向多核、高性能方向發(fā)展[1]。 多核DSP以較低的功耗提供了更強(qiáng)的計算處理能力,同時能夠簡化硬件電路板的設(shè)計復(fù)雜度。
多核DSP的應(yīng)用給開發(fā)者帶來了新的挑戰(zhàn),不僅需要新的編程模型和代碼框架,還需要新的工具環(huán)境支持多核DSP并行編程和調(diào)試。
Eclipse及C/C++ Toolkit(CDT)是目前在嵌入式領(lǐng)域廣泛使用的集成開發(fā)環(huán)境[2],集成了編譯、工程管理、代碼分析索引、源碼調(diào)試等多種開發(fā)功能。調(diào)試服務(wù)框架(Debugging Service Framework,DSF)重構(gòu)了CDT中的調(diào)試功能實(shí)現(xiàn),為嵌入式應(yīng)用的調(diào)試提供了更加快速靈活的界面。CDT/DSF利用MI文本接口,采用一問一答的方式與調(diào)試器進(jìn)行進(jìn)程間通信,但是MI接口不支持多核,開源的DSF代碼并不支持多核調(diào)試。為了實(shí)現(xiàn)支持多核調(diào)試環(huán)境,不僅需要重新設(shè)計MI接口,而且要對DSF框架進(jìn)行擴(kuò)展。調(diào)試后端,需要一個支持多核調(diào)試的調(diào)試器。
本文提出一個面向多核DSP的調(diào)試開發(fā)環(huán)境,集成了多核調(diào)試工具M(jìn)CCD[3],擴(kuò)展Eclipse的C語言開發(fā)插件CDT,并針對多核調(diào)試的需求增加了相應(yīng)功能。
圖1 多核DSP調(diào)試環(huán)境的架構(gòu)圖
多核DSP調(diào)試環(huán)境的架構(gòu)如圖1所示,多核DSP調(diào)試環(huán)境集成了多核DSP主機(jī)調(diào)試器MCCD,實(shí)現(xiàn)具體的調(diào)試功能。調(diào)試環(huán)境與MCCD之間通過文本格式的進(jìn)程間通信管道傳輸調(diào)試命令與調(diào)試返回信息,該調(diào)試信息遵循MI接口格式,但針對多核DSP的特點(diǎn)擴(kuò)展了調(diào)試命令及信息。當(dāng)使用軟件模擬器(Simulator)調(diào)試時,主機(jī)調(diào)試器通過socket與模擬器之間進(jìn)行通信,當(dāng)調(diào)試目標(biāo)是硬件電路板時,主機(jī)調(diào)試器通過以太網(wǎng)接口與調(diào)試鏈接服務(wù)軟件交換調(diào)試報文,調(diào)試鏈接服務(wù)軟件通過JTAG控制多核DSP芯片進(jìn)行調(diào)試工作。
在多核DSP調(diào)試環(huán)境中,用戶可以為每個核配置相應(yīng)的可執(zhí)行加載文件并啟動調(diào)試,調(diào)試視圖中會顯示每個核的運(yùn)行狀況及堆棧信息。當(dāng)用戶在調(diào)試視圖中選擇任意核或其下面的條目時,由于調(diào)試視圖為整個調(diào)試透視圖提供調(diào)試上下文,寄存器視圖、變量視圖、反匯編視圖就會根據(jù)當(dāng)前上下文反映當(dāng)前選中核的信息;運(yùn)行、暫停、單步跳入/跳出/跳過按鈕也會根據(jù)選中的上下文對當(dāng)前選中核進(jìn)行控制操作。根據(jù)多核DSP的特點(diǎn),調(diào)試環(huán)境提供了組運(yùn)行、組暫停等同步調(diào)試功能,并提供核心組的配置及選擇功能。
多核DSP調(diào)試環(huán)境的用戶界面如圖2所示。
圖2 多核DSP調(diào)試環(huán)境的用戶界面
2.1 MI接口擴(kuò)展
MI接口原本是GDB的一種用戶接口,稱為機(jī)器解釋(Machine Interpretation,MI)[4],是一種基于文本行、面向機(jī)器的文本接口,尤其適用于調(diào)試器作為一個較大系統(tǒng)的一部分而存在的應(yīng)用。Eclipse社區(qū)目前提供的C語言開發(fā)環(huán)境就是使用MI接口集成GDB,由于GDB支持目標(biāo)機(jī)的多樣性,該開發(fā)環(huán)境已廣泛使用于多種嵌入式開發(fā)項(xiàng)目中,包括Intel、ARM、PowerPC等目標(biāo)環(huán)境。
MI命令的基本格式如下:
[token] "-" operation (" " option)* [ "- -"] (" " parameter)*
其中,token為命令序號,必須是一個整數(shù),當(dāng)一個調(diào)試命令運(yùn)行結(jié)束后,返回的信息中也有這個數(shù)字;operation是調(diào)試命令;option是調(diào)試命令選項(xiàng),有些調(diào)試命令可能存在一些可選開關(guān),這些開關(guān)必須由“-”(橫線)開始;parameter是調(diào)試命令的參數(shù)。option序列與parameter序列之間必須由雙橫線“- -”隔開。
MI的輸出信息格式如下:
[token] "^" result-class ("," result)* nl
其中,token為相應(yīng)命令輸入時指定的整數(shù);result-class包括done、running、connected、error、exit等,必須以"^"開頭;result以Variable =value的格式顯示結(jié)果,Variable 為變量名,value為變量值,分為const、tuple、list三種格式,其中const為一個C字符串,tuple為大括號括起來的result集合,相當(dāng)于一個結(jié)構(gòu)體;list為中括號括起來的value或者result集合,相當(dāng)于一個數(shù)組。
多核DSP調(diào)試集成了自主研發(fā)的多核DSP調(diào)試軟件MCCD,沿用MI接口的命令和信息格式,并針對多核DSP的特性對MI接口進(jìn)行了擴(kuò)展。對大部分MI接口,在命令中增加-c選項(xiàng),指定調(diào)試操作的對象核,并在返回信息中返回相應(yīng)的核號。
例如,GDB/MI中的繼續(xù)運(yùn)行命令為:
[token]-exec-continue
返回信息為:
[token]^running
本系統(tǒng)中對核0發(fā)出的繼續(xù)運(yùn)行命令為:
[token]-exec-continue -c 0
返回信息為:
[token]^running, core="0"
當(dāng)核0遇到特定事件(如斷點(diǎn)觸發(fā))發(fā)生狀態(tài)改變時,MCCD向集成開發(fā)環(huán)境返回:
[token]*stopped,reason="breakpoint-hit",core="0",bkptno="2",thread-id="1",frame={addr="0x00401331",func="main",args=[],file="main.c",fullname="C:/main.c",line="7"}
指示核0因斷點(diǎn)觸發(fā)而停止運(yùn)行,并顯示觸發(fā)斷點(diǎn)的序號及核0當(dāng)前的棧頂信息。同時,為了實(shí)現(xiàn)多核同步控制運(yùn)行的功能,本系統(tǒng)為多核同步調(diào)試運(yùn)行增加了以下兩個命令:
-multicore-run:多核同步運(yùn)行
-multicore-pause:多核同步暫停
2.2 DSF架構(gòu)的擴(kuò)展
調(diào)試服務(wù)框架(Debugger Services Framework,DSF)[5]是Eclipse提供的一個新的應(yīng)用程序接口,用于在Eclipse中集成外部調(diào)試器,代替?zhèn)鹘y(tǒng)的標(biāo)準(zhǔn)調(diào)試接口CDI。DSF不僅能夠幫助開發(fā)者更加靈活地配置調(diào)試界面,還能夠達(dá)到更高的調(diào)試性能,特別適合速度較慢或遠(yuǎn)程調(diào)試的目標(biāo)機(jī)。
DSF是面向服務(wù)的框架,基于OSGi(Open Service Gateway Initiative)規(guī)范。OSGi是一個基于Java的軟件平臺,支持模塊化、即插即用的動態(tài)服務(wù)及可擴(kuò)展性[6],Eclipse的運(yùn)行框架Equinox就是OSGi的一種實(shí)現(xiàn)。調(diào)試相關(guān)的各種功能以服務(wù)的形式嵌入集成開發(fā)環(huán)境,包括調(diào)試后臺服務(wù)、運(yùn)行控制服務(wù)、斷點(diǎn)管理服務(wù)、寄存器管理服務(wù)等,各個服務(wù)通過DSF接口注冊到服務(wù)注冊表,并由調(diào)試會話類DsfSession統(tǒng)一管理同一個調(diào)試會話中的所有服務(wù)及服務(wù)之間的通信。
DSF調(diào)試框架中的數(shù)據(jù)模型由IDMContext對象的層次結(jié)構(gòu)構(gòu)成。IDMContext是有層次結(jié)構(gòu)的數(shù)據(jù)模型結(jié)構(gòu),每個IDMContext節(jié)點(diǎn)可以有多個父節(jié)點(diǎn),具有可適配、輕量級、線程安全的特點(diǎn)。每個節(jié)點(diǎn)都可以通過getParents()方法得到所有的父節(jié)點(diǎn),工具類IDMContext提供很多靜態(tài)方法為IDMContext節(jié)點(diǎn)在樹形結(jié)構(gòu)中搜索。
C語言調(diào)試的IDMContext數(shù)據(jù)模型層次結(jié)構(gòu)如圖3所示。圖中所有的節(jié)點(diǎn)繼承IDMContext接口,每根連線的上級為父節(jié)點(diǎn),下級為子節(jié)點(diǎn)。例如,變量上下文IVariableDMContext的父節(jié)點(diǎn)是棧幀上下文IFrameDMContext,而IFrameDMContext的父節(jié)點(diǎn)是執(zhí)行線程上下文IExecutionDMContext,IExecutionDMContext的父節(jié)點(diǎn)是調(diào)試目標(biāo)節(jié)點(diǎn)IContainerDMContext,IContainerDMContext的父節(jié)點(diǎn)是調(diào)試過程上下文IProcessDMContext,IProcessDMContext的父節(jié)點(diǎn)是命令控制上下文ICommandControlDMContext。這樣,由變量上下文向上追溯,就可以確定該變量位于哪個調(diào)試目標(biāo)的哪個線程的哪個棧幀,并且可以知道需要在哪個調(diào)試會話中查詢。
圖3 IDMContext數(shù)據(jù)模型層次結(jié)構(gòu)
很明顯,要在這種層次結(jié)構(gòu)中帶入核號信息,最合適的地方就是調(diào)試目標(biāo)節(jié)點(diǎn)IContainerDMContext,因?yàn)樗姓{(diào)試相關(guān)數(shù)據(jù)的上下文都可以追溯到它,而它上部的節(jié)點(diǎn)都是與調(diào)試器進(jìn)程相關(guān)的。本系統(tǒng)僅使用一個調(diào)試器進(jìn)程實(shí)例調(diào)試所有的核心,因此ICommandControlDMContext和IProcessDMContext都只有一個實(shí)例。
本系統(tǒng)擴(kuò)展了IContainerDMContext接口,構(gòu)造IECSContainerDMContext接口,加上了如下方法:
public String getCoreId();
該接口的實(shí)現(xiàn)只需要返回核號即可。圖3中IContainerDMContext以下的節(jié)點(diǎn)全部以IECSContainerDMContext為父節(jié)點(diǎn),這樣就可以確定每個調(diào)試上下文具體在哪個核。
例如,要在某個指定核上對某變量上下文IVariableDMContext求值,只需要調(diào)用:
IECSContainerDMContext containerdmc = DMContexts.getAncestorOfType(context, IECSContainerDMContext.class);String coreId = containerdmc.getCoreId();
即可以得到核號。把這個核號用-c選項(xiàng)帶入MI命令,就可以正確地在指定核上求變量的值。
2.3 多核運(yùn)行控制功能
多核運(yùn)行控制主要包括對多核運(yùn)行組配置的保存及針對指定組發(fā)送-multicore-run及-multicore-pause命令,還負(fù)責(zé)單核與單核調(diào)試模式的切換、調(diào)試對象核心組的選擇。
本系統(tǒng)注冊了一個新的DSF服務(wù):多核運(yùn)行控制服務(wù)IECSMultiRunControl。該服務(wù)主要提供以下功能接口:
① 多核調(diào)試模式是否被啟動;
② 選擇當(dāng)前多核調(diào)試組;
③ 增加多核調(diào)試組配置,包括組名、組中所有的核號序列;
④ 判斷能否運(yùn)行當(dāng)前多核組;
⑤ 判斷能否暫停當(dāng)前多核組;
⑥ 運(yùn)行當(dāng)前多核調(diào)試組中所有的核;
⑦ 暫停當(dāng)前多核調(diào)試組中所有的核。
同時,構(gòu)造調(diào)試運(yùn)行控制服務(wù)MIRunControl的子類ECSRunControl,覆蓋了以下方法:
resume(IExecutionDMCon-
text,RequestMonitor);
canResume(IExecutionDMContext,DataRequestMonitor);
canSuspend(IExecutionDMContext,DataRequestMonitor);
suspend(IExecutionDMContext,RequestMonitor);
Integration of Multi-core DSP Debugging System Based on Eclipse
Zhu Yan,Lin Guangdong,Huang Guanghong
(CETC No.38 Research Institute,Hefei 230088,China)
An application software development environment integrated multi-core DSP debug system is proposed in the paper.The environment is designed based on open source Eclipse,and modifies and extends CDT/DSF framework aiming at the parallel characteristic of multi-core.The software provides a stable,speedy development environment which supports both single-core and multi-core debugging,and helps the developers improve their efficiency and quality in the development process.
DSP;Eclipse;multi-core debugging
TP314
A