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