国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

一款自主可控調(diào)試器軟件架構(gòu)設(shè)計

2023-06-07 09:42:44林廣棟黃光紅趙紀(jì)堂郭利鋒
計算機(jī)應(yīng)用與軟件 2023年5期
關(guān)鍵詞:基類子類調(diào)試

林廣棟 黃光紅 趙紀(jì)堂 郭利鋒 耿 銳

(安徽芯紀(jì)元科技有限公司 安徽 合肥 230088)

0 引 言

計算機(jī)軟件誕生之初,調(diào)試器就是軟件開發(fā)人員的重要工具。最初的調(diào)試器是基于硬件直接實(shí)現(xiàn)的,通過硬件設(shè)備提供計算機(jī)底層的信息。直到計算機(jī)基礎(chǔ)軟件(如操作系統(tǒng)、編譯器)發(fā)展成熟到一定程度之后,用戶友好的開源或商業(yè)化調(diào)試軟件才出現(xiàn)。調(diào)試器的工作原理是基于處理器的硬件機(jī)制,或基于操作系統(tǒng)封裝后的異常處理機(jī)制,結(jié)合編譯器生成的調(diào)試信息,將軟件的狀態(tài)以方便的方式提供給軟件開發(fā)人員,并支持軟件開發(fā)人員對正在調(diào)試的軟件的狀態(tài)進(jìn)行修改。調(diào)試器的基本功能包括控制軟件運(yùn)行、查看軟件運(yùn)行時的信息、修改軟件執(zhí)行流程或狀態(tài)等。先進(jìn)的調(diào)試器還會添加事件分析、向后運(yùn)行等功能。時至今時,應(yīng)用于計算機(jī)各領(lǐng)域的調(diào)試系統(tǒng)仍然在不斷發(fā)展中,各種新技術(shù)層出不窮[1-9]。近年來的創(chuàng)新點(diǎn)主要集中在針對新型架構(gòu)處理器的調(diào)試技術(shù)[3]、針對區(qū)塊鏈軟件的調(diào)試技術(shù)[5]、針對虛擬仿真環(huán)境的調(diào)試技術(shù)[6]、智能調(diào)試技術(shù)[8]等。

目前,最常見開源調(diào)試器是GNU維護(hù)的GDB[10-12]。GDB是起源于Linux環(huán)境的調(diào)試器,既可以調(diào)試本機(jī)上運(yùn)行的Linux進(jìn)程,也可以調(diào)試遠(yuǎn)端的嵌入式處理器。GDB定義了基于字符串的RSP(Remote Serial Protocol)通信協(xié)議與嵌入式調(diào)試硬件(如在線仿真器ICE:In-Circuit Emulator)進(jìn)行通信?;赗SP和ICE,GDB可以對嵌入式處理器進(jìn)行調(diào)試操作,如查看/修改寄存器、查看/修改內(nèi)存、暫停/運(yùn)行處理器等等。結(jié)合GNU的另一個工具GDBServer,還可以調(diào)試遠(yuǎn)端Linux系統(tǒng)上運(yùn)行的進(jìn)程。GDB是開源軟件,已經(jīng)被很多處理器廠商移植用于嵌入式處理器的調(diào)試,是目前使用最廣泛的調(diào)試工具[13-16]。但GDB對由數(shù)百片芯片組合而成的處理器陣列的調(diào)試功能支持不夠完善。

LLVM基金會維護(hù)的LLDB是近年來新開發(fā)的調(diào)試器軟件[17]。由于它和著名的開源編譯器LLVM一起維護(hù),也值得引起關(guān)注。LLDB的目標(biāo)是解決多線程調(diào)試、C++模板、重載等問題。它采用與GDB完全不同的軟件架構(gòu),其命令接口也與GDB不兼容。LLDB已經(jīng)可以在macOS系統(tǒng)上成熟地使用。但LLDB的應(yīng)用范圍目前還比較窄,其在Linux系統(tǒng)上雖然可以使用,但仍然在改進(jìn)。LLDB目前還不支持調(diào)試Windows上的程序。

另外,還有一些比較小眾的商業(yè)調(diào)試器,如德國的勞特巴赫(LAUTERBACH)公司開發(fā)的TRACE32工具[18]。TRACE32是一款比較高端的調(diào)試器,價格非常昂貴。TRACE32開發(fā)工具擁有非常強(qiáng)大的功能,包括基本調(diào)試配置、RTOS、多核系統(tǒng)、虛擬目標(biāo)調(diào)試、能耗分析以及強(qiáng)大的腳本語言等功能,可以支持市場中使用的80多種常見的微處理器架構(gòu)。在TRACE32的界面中,用戶可以使用菜單、鼠標(biāo)完成調(diào)試操作,也可以使用命令行操作。命令行操作可以完成菜單鼠標(biāo)可以實(shí)現(xiàn)的所有功能,而且具有更大的靈活性。TRACE32的命令接口與GDB也是不兼容的。

美國的Green Hills公司是業(yè)界領(lǐng)先的嵌入式軟件平臺和開發(fā)環(huán)境供應(yīng)商,專注于研發(fā)嵌入式編譯器、調(diào)試器、操作系統(tǒng)、開發(fā)環(huán)境[19]。該公司推出的TimeMachine調(diào)試套件是業(yè)界首個為開發(fā)人員在程序運(yùn)行的時間維度上提供向前和向后完全可視性的調(diào)試器。該調(diào)試器可以在程序出錯時讓程序按時間順序向后連續(xù)或單步運(yùn)行,從而快速準(zhǔn)確地找出發(fā)生錯誤的地方。該調(diào)試器還可以采集操作系統(tǒng)內(nèi)核服務(wù)調(diào)用等操作系統(tǒng)事件的跟蹤數(shù)據(jù)。該調(diào)試器提供的PathAnalyzer工具可以顯示程序調(diào)用棧的歷史變化記錄。

TRACE32和TimeMachine都是商業(yè)收費(fèi)軟件,應(yīng)用范圍并不廣泛。目前,應(yīng)用最廣泛、研究最集中的還是開源調(diào)試器軟件GDB。本文將以GDB為參考,介紹一款自主可控的調(diào)試器軟件。

本文介紹了一款新穎的調(diào)試器軟件架構(gòu)。該調(diào)試器軟件沒有在開源調(diào)試器軟件的基礎(chǔ)上進(jìn)行改造,而是完全正向開發(fā)。其核心模塊調(diào)試信息解析模塊更是完全自主開發(fā)的。相比開源調(diào)試器軟件,該調(diào)試器軟件具有代碼量少、對多核/多芯片/多板卡調(diào)試的支持更完備的特點(diǎn)。

1 簡 介

“魂芯”系列DSP是由中國電子科技集團(tuán)公司第三十八研究所自主研發(fā)的高性能多核DSP?!盎晷尽毕盗蠨SP配套有完備的基礎(chǔ)軟件,包括編譯器、匯編工具鏈、調(diào)試器、操作系統(tǒng)、集成開發(fā)環(huán)境等?!盎晷尽迸涮椎恼{(diào)試器軟件稱為MCCD(Multi Core Code Debugger)[20-24]。MCCD從2012年開始開發(fā),其命令行接口基于GDB的MI接口改造而來,目前也支持與GDB基本兼容的簡寫命令集。與GDB相比,MCCD具有如下特點(diǎn):

GDB的8.3版的代碼庫有4 850個文件,兩百多萬行代碼。而MCCD目前只有111個文件,5萬余行代碼。MCCD目前基本滿足可視化開化環(huán)境的調(diào)試需求,且支持C/C++高級語言調(diào)試。MCCD雖然沒有GDB功能豐富,但是完全夠用。由代碼量可以看出,MCCD是一個非常簡潔的調(diào)試器軟件。

根據(jù)“魂芯”的硬件架構(gòu)和軟件環(huán)境進(jìn)行深度定制化開發(fā)。針對“魂芯”的硬件架構(gòu)和軟件環(huán)境,MCCD在如下幾個方面進(jìn)行了定制化的開發(fā):多核調(diào)試、反匯編、芯片寄存器/內(nèi)存段定義、C語言系統(tǒng)調(diào)用(輸入輸出、文件操作等)、板級配置、字/字節(jié)調(diào)試信息轉(zhuǎn)換等。這些功能經(jīng)過多年的測試,已經(jīng)成熟。

支持處理器集群調(diào)試。GDB對處理器集群調(diào)試的支持比較薄弱。GDB使用inferior的概念來管理一個被調(diào)試的進(jìn)程,當(dāng)需要調(diào)試多個進(jìn)程時,要通過add-inferior命令添加inferior。GDB的調(diào)試命令只能發(fā)給一個inferior。如果要調(diào)試其他進(jìn)程,需要通過inferior infno命令來設(shè)置infno號inferior為當(dāng)前調(diào)試進(jìn)程。此后GDB收到的調(diào)試命令都是針對該進(jìn)程。當(dāng)通過RSP協(xié)議調(diào)試嵌入式系統(tǒng)時,一個嵌入式設(shè)備相當(dāng)于一個被調(diào)試的進(jìn)程??梢?GDB同時只能對一個RSP協(xié)議管理的遠(yuǎn)程調(diào)試鏈接進(jìn)行調(diào)試。而MCCD經(jīng)過定制化開發(fā),已經(jīng)可以支持對處理器集群的調(diào)試。通過解析調(diào)試命令后把底層調(diào)試通信包分發(fā)給不同的調(diào)試終端,MCCD支持一條調(diào)試命令同時對不同嵌入式設(shè)備上的多個處理器執(zhí)行多核調(diào)試操作。

GDB相比MCCD,命令行接口更為豐富,且支持對Python、FORTRAN等語言的調(diào)試。但是短期內(nèi)沒有在DSP上調(diào)試除C/C++語言以外的程序的需求。因此,MCCD的調(diào)試功能目前來看是足夠滿足“魂芯”DSP調(diào)試需求的。

GDB是由GNU開源組織維護(hù)的開源調(diào)試器軟件,是Linux系列下以及大多數(shù)嵌入式芯片調(diào)試的首選工具。GDB一直被持續(xù)維護(hù)和更新,目前已經(jīng)更新到8.3.1版。GDB既支持對本機(jī)運(yùn)行的程序進(jìn)行調(diào)試,也支持通過RSP協(xié)議對遠(yuǎn)程運(yùn)行的程序進(jìn)行調(diào)試。大多數(shù)嵌入式芯片的開發(fā)環(huán)境都通過移植GDB來支持調(diào)試。常見的做法是新增一個協(xié)議轉(zhuǎn)換軟件,該軟件一方面通過RSP協(xié)議與GDB進(jìn)行通信,一方面通過私有協(xié)議與嵌入式調(diào)試硬件進(jìn)行通信。MCCD與GDB在調(diào)試功能上的對比結(jié)果見表1。可以看出,相對于GDB,MCCD在處理器集群調(diào)試方面具有一些獨(dú)特的優(yōu)勢。

2 設(shè) 計

2.1 架構(gòu)介紹

MCCD內(nèi)部的整體架構(gòu)如圖1所示。MCCD以命令行接口的形式提供給用戶或集成開發(fā)環(huán)境使用。MCCDMI負(fù)責(zé)接收用戶輸入并打印MCCD輸出。無論MCCD調(diào)試多少個芯片,其命令行接口只有一個。因此,MCCDMI模塊只有一個實(shí)例。MCCDDebugger負(fù)責(zé)管理一個調(diào)試終端控制的多個芯片。調(diào)試終端代表一個與MCCD進(jìn)行通信,并被MCCD調(diào)試的實(shí)體,可以是一個在線仿真器,也可以是一個芯片內(nèi)部的具有調(diào)試功能的MCU。一個調(diào)試終端與MCCD之間通過一個TCP/IP協(xié)議進(jìn)行通信。MCCD每多管理一個調(diào)試終端,就多實(shí)例化一個MCCDDebugger。隨著MCCD管理的調(diào)試終端的增多,MCCDDebugger的實(shí)例也隨之增多。

圖1 MCCD內(nèi)部運(yùn)行時軟件實(shí)例架構(gòu)圖

每個MCCDDebugger實(shí)例負(fù)責(zé)具體的各種調(diào)試功能,其內(nèi)部架構(gòu)如圖2所示。

圖2 MCCDDebugger內(nèi)部架構(gòu)圖

各模塊的功能簡介如表2所示。

表2 MCCD內(nèi)部各主要模塊簡介

續(xù)表2

2.2 功能實(shí)現(xiàn)流程

下面以查看變量為例展示上述各模塊之間互相配合完成調(diào)試動作的整體流程。按存儲位置劃分,變量分為局部變量和全局變量兩類。局部變量的位置需要分析當(dāng)前活動的函數(shù)棧,找到用戶當(dāng)前選擇的調(diào)試函數(shù)幀,結(jié)合調(diào)試信息中存儲的局部變量偏移位置,得到局部變量的地址。全局變量的地址可以直接通過調(diào)試信息獲取。按復(fù)雜程度劃分,變量又可以分為簡單變量和復(fù)雜變量。普通的int、long long、float、double型變量為簡單變量,得到其地址后通過讀內(nèi)存就可以獲取其值。struct、數(shù)組、指針類型的變量為復(fù)雜變量,得到這些變量的地址后,還需要通過更復(fù)雜的解析方法,得到其內(nèi)部的struct元素、數(shù)組元素或指針指向的地址。若用戶要查看的是復(fù)雜變量內(nèi)部包含的更深層次的元素,則需要逐層解析,直到找到用戶指定的內(nèi)部元素的地址。圖3展示了一般的查看變量調(diào)試功能實(shí)現(xiàn)流程。受篇幅限制,圖中沒有展示查看復(fù)雜變量的具體流程,查看復(fù)雜變量的過程可參考文獻(xiàn)[12]。圖中各序號按遞增的順序代表完成查看變量調(diào)試動作需要執(zhí)行的步驟。各步驟簡述如下:

(1) 用戶或IDE(集成開發(fā)環(huán)境)發(fā)送查看變量命令。

(2) 根據(jù)調(diào)試命令中指定的核號或當(dāng)前默認(rèn)調(diào)試核號,找到管理該調(diào)試對象的MCCDDebugger類實(shí)例。

(3) 通過ThreadManager模塊,得到當(dāng)前活動棧的當(dāng)前調(diào)試幀的位置。

(4) 通過DebugInfo模塊,結(jié)合當(dāng)前調(diào)試幀的位置,得到用戶要查看的變量(或變量內(nèi)部的元素)的地址。

(5) 向MemoryManage模塊發(fā)送讀取內(nèi)存請求,此時的內(nèi)存地址為軟件看到的32位地址。

(6) 判斷該地址是否屬于芯片外部地址,如DDR上的地址。若屬于,進(jìn)行相應(yīng)的地址轉(zhuǎn)換。

(7) 判斷該地址是否屬于芯片內(nèi)部的地址,如片上SRAM的地址。若屬于,根據(jù)多核處理器的核內(nèi)地址和全局地址的轉(zhuǎn)換規(guī)則,進(jìn)行相應(yīng)的轉(zhuǎn)換。

(8) 向TargetDebug模塊發(fā)送讀內(nèi)存請求。此時內(nèi)存地址為硬件實(shí)現(xiàn)上的最終物理地址。

(9) TargetDebug向嵌入式系統(tǒng)上的調(diào)試終端發(fā)送查看內(nèi)存命令,獲取該地址上的值。

(10) TargetDebug返回指定硬件地址上的值給MemoryManage。

(11) MemoryManage返回軟件地址上的內(nèi)存值。

(12) MCCDebugger返回用戶指定的變量的值、類型。

(13) MCCDMI根據(jù)變量的值、類型等信息,將變量值轉(zhuǎn)換為字符串,輸出查看變量命令的返回結(jié)果。

圖3 查看變量調(diào)試功能實(shí)現(xiàn)流程

2.3 功能模塊接口設(shè)計

依賴倒置原則(Dependence Inversion Principle)是面向?qū)ο缶幊痰牧蠡驹瓌t之一。該原則要求程序盡量信賴于抽象接口,而不是具體實(shí)現(xiàn)。該原則可以通俗地表達(dá)為“對接口編程,而不是對實(shí)現(xiàn)編程”?;谠撛瓌t,可以使軟件模塊之間的依賴關(guān)系限定到模塊的接口,與模塊的具體實(shí)現(xiàn)解耦,使軟件易于擴(kuò)展、修改。MCCD各子模塊的設(shè)計都遵守這一原則。每個功能模塊,首先設(shè)計獨(dú)立的接口,MCCDDebugger只調(diào)用這些基類定義的接口。接口是一個抽象基類,該類中只定義純虛函數(shù),不定義成員變量和實(shí)體函數(shù)。這些純虛函數(shù)代表一個模塊對外提供的接口。每個模塊的功能實(shí)現(xiàn)在該基類的子類中。若該模塊在不同的情況下有不同的實(shí)現(xiàn),則定義不同的子類,每個子類獨(dú)立地實(shí)現(xiàn)相同的基類接口。MCCDDebugger根據(jù)實(shí)際運(yùn)行時的情況,決定實(shí)例化哪個子類。MCCDDebugger中,始終維護(hù)一個基類的指針,并調(diào)用基類提供的接口。根據(jù)虛函數(shù)的性質(zhì),實(shí)際運(yùn)行時,MCCDDebugger中的函數(shù)調(diào)用會自動轉(zhuǎn)化為對具體子類實(shí)現(xiàn)的調(diào)用。

IRemoteComm是TargetDebug內(nèi)部使用的與硬件仿真器或芯片模擬器通信模塊接口。如圖4所示,IRemoteComm是一個包含純虛函數(shù)的基類,它有兩個子類UDPRemoteComm和TCPRemoteComm。這兩個子類中會定義實(shí)現(xiàn)具體通信功能的函數(shù)。在某些硬件仿真器中,由于片上SRAM的限制,不能使用TCP協(xié)議,只能使用UDP協(xié)議。因此,MCCD既支持TCP通信,又支持UDP通信。UDPRemoteComm負(fù)責(zé)實(shí)現(xiàn)UDP調(diào)試通信協(xié)議,TCPRemoteComm負(fù)責(zé)實(shí)現(xiàn)TCP調(diào)試通信協(xié)議。MCCDDebugger在開啟一個調(diào)試會話時,根據(jù)用戶的選擇來決定實(shí)例化UDPRemoteComm還是TCPRemoteComm。MCCDDebugger中的實(shí)現(xiàn)代碼,只調(diào)用IRemoteComm中定義的函數(shù)接口,具體運(yùn)行過程中,會自動調(diào)用其子類中的函數(shù)。

圖4 通信基類與子類關(guān)系

某些模塊的所有子類有一些共同的實(shí)現(xiàn),或需要相同的成員變量。這些相同的成員變量和實(shí)現(xiàn)可以再集中到一個類中。具體的不同實(shí)現(xiàn)再定義為這個類的子類。如圖5所示,IDisAssemble定義了反匯編類的接口。所有反匯編類的實(shí)現(xiàn)都有一些共同的操作,如根據(jù)機(jī)器碼中的值格式化字符串、獲取機(jī)器碼中的若干位等。這些相同的操作若分別在各子類中實(shí)現(xiàn),則代碼會非常冗余。因此,定義類CDisAssemble,該類實(shí)現(xiàn)了這些共同操作。針對具體不同芯片的反匯編類再繼承自此子類。DisAssemble100、DisAssemble1042、DisAssemble1041分別是針對不同芯片類型的反匯編子類。這些子類只需要實(shí)現(xiàn)該芯片的指令集中的不同操作碼即可。

DisAssemblePred代表對一種帶有謂詞控制功能的指令集的反匯編功能。該類中定義了對機(jī)器碼中的謂詞進(jìn)行反匯編的常用操作。所有帶有謂詞控制功能的芯片的反匯編類都繼承自DisAssemblePred。HXDSP1041芯片的指令集帶有謂詞控制功能,因此其反匯編類DisAssemble1041繼承自DisAssemblePred。

圖5 反匯編基類與子類關(guān)系

2.4 設(shè)計模式

設(shè)計模式是伽馬等[25]基于軟件開發(fā)工業(yè)中常見的優(yōu)秀設(shè)計方法總結(jié)提煉出的軟件設(shè)計一般方法。軟件按照設(shè)計模式總結(jié)的方法進(jìn)行設(shè)計,會易于維護(hù)、擴(kuò)展。設(shè)計模式為軟件從業(yè)人員提供了一套易于交流的概念和方法。目前公認(rèn)的設(shè)計模式有23條。MCCD使用C++語言實(shí)現(xiàn),為簡化軟件架構(gòu)、方便代碼維護(hù),大量使用設(shè)計模式。

1) 單件模式。單件模式確保一個類在整個程序中只有一個實(shí)例,且這個實(shí)例在整個程序中是共享的。無論調(diào)試的對象有多少個,MCCD都只有一個命令行接口。MCCD中使用MCCDMI類來解析調(diào)試命令,MCCDMI類只需要實(shí)例化一次。MCCD中使用單件模式實(shí)例化MCCDMI類。

2) 工廠方法。工廠方法定義類的一種方法,由該方法根據(jù)當(dāng)程序的具體情況決定實(shí)例化哪個類。工廠方法返回一個該類的抽象接口。根據(jù)芯片類型的不同,各種調(diào)試動作的實(shí)現(xiàn)方法也不同,MCCDDebugger應(yīng)根據(jù)不同的芯片類型分別實(shí)例化不同的調(diào)試功能類。每個調(diào)試功能類都有一個對應(yīng)的工廠方法,該工廠方法的參數(shù)是芯片類型,返回該調(diào)試功能子類的抽象接口。該工廠方法內(nèi)部,根據(jù)不同的芯片類型,實(shí)例化該調(diào)試功能基類的不同子類,并返回實(shí)例化的子類的指針。根據(jù)不同的芯片類型,該工廠方法“制造”出不同的功能子類,但在MCCDDebugger內(nèi)部仍然以抽象接口的方式使用這些功能子類。這些抽象接口以虛函數(shù)的方式定義,會在運(yùn)行時調(diào)用實(shí)例化的子類的具體的實(shí)現(xiàn)。

3) 狀態(tài)模式。狀態(tài)模式使一個對象的內(nèi)部狀態(tài)改變時改變其行為。當(dāng)判斷當(dāng)前對象所處狀態(tài)的表達(dá)式太過繁瑣時,可以把對象的行為轉(zhuǎn)移到代表不同狀態(tài)的子類中。調(diào)試終端可能處于不同的狀態(tài)下,如未連接狀態(tài)、已連接狀態(tài),調(diào)試芯片已選擇狀態(tài)等。每種狀態(tài)下,同樣的調(diào)試操作有不同的表現(xiàn),需要以不同的方式實(shí)現(xiàn)。若簡單地讓每種調(diào)試操作根據(jù)所處的狀態(tài)作不同的處理,則各調(diào)試操作函數(shù)內(nèi)部將會有類似的對調(diào)試對象狀態(tài)對進(jìn)判斷的語句。如果以這種方式實(shí)現(xiàn),不同狀態(tài)下的調(diào)試功能實(shí)現(xiàn)代碼將耦合在同一個類的各個方法中,難以維護(hù)和擴(kuò)展。MCCD使用狀態(tài)模式,定義一個實(shí)現(xiàn)各種調(diào)試操作的抽象接口基類MCCDDebugState。該接口基類是一個純虛類,只定義抽象接口。再定義該接口基類在各種狀態(tài)下的具體實(shí)現(xiàn)子類,如DisconnectedMCCDDebugger、UnselectedMCCDDebugger、SelectedMCCDDebugger等。每個子類僅僅代表一種狀態(tài)下該調(diào)試操作的具體實(shí)現(xiàn)形式。MCCDDebugger把調(diào)試操作代理給調(diào)試操作的狀態(tài)子類,由該子類完成具體調(diào)試操作。當(dāng)調(diào)試對象的狀態(tài)發(fā)生變化時,只需要把狀態(tài)基類的指針替換為新狀態(tài)子類的指針即可。通過這種方式,把不同狀態(tài)下調(diào)試操作的具體實(shí)現(xiàn)方式分離開來,便于代碼擴(kuò)展與維護(hù)。

2.5 配置文件

MCCD一個可執(zhí)行文件可以支持調(diào)試HXDSP100、HXDSP1042、HXDSP1041、HXDSP2441等多種芯片。每種芯片的寄存器數(shù)量、名稱、地址不同,內(nèi)存段數(shù)量、大小、地址也不同。如果將這些信息固定在代碼中,將會導(dǎo)致代碼與芯片配置綁定,不利于代碼維護(hù),不利于運(yùn)行時查錯。MCCD使用兩種XML文件描述與功能無關(guān)的信息:芯片配置XML文件、板級配置XML文件。芯片配置XML文件描述芯片內(nèi)部的、僅僅與芯片相關(guān)的信息,如寄存器名稱、讀寫屬性、地址等。而板級配置XML文件描述芯片外部的、與不同板卡相關(guān)的信息,如FLASH類型、大小、DDR配置信息等。通過這種方式,將調(diào)試功能實(shí)現(xiàn)流程用代碼實(shí)現(xiàn),而與具體芯片、板卡相關(guān)的信息用XML文件描述。這樣,MCCD軟件的代碼中不會出現(xiàn)具體的寄存器地址、FLASH大小等信息,易于代碼維護(hù)。在MCCD使用過程中,根據(jù)需要選擇配置不同的XML文件或修改XML文件的內(nèi)容,以適應(yīng)不同的芯片或板卡,方便了MCCD軟件發(fā)行之后的維護(hù)。

1) 芯片配置文件。芯片描述XML文件描述芯片內(nèi)部的信息,主要包括如下內(nèi)容:(1) 片上SRAM的名稱、地址、大小;(2) 流水線各級的名稱、流水線程序地址、流水線指令寄存器地址;(3) 寄存器名稱、讀寫屬性、地址等。

圖6為一個芯片描述XML文件中部分內(nèi)容的示例圖。這段XML文件的內(nèi)容描述了4個寄存器的相關(guān)信息。其他片上寄存器的信息也以類似的方式描述。

圖6 芯片描述XML文件部分內(nèi)容示例

每次MCCD開啟一次調(diào)試會話前,首先加載芯片描述XML文件,解析其中的內(nèi)容,把相關(guān)的信息存儲到RegisterManager、MemoryManager、PipelineManager等類的實(shí)例中。之后的調(diào)試功能實(shí)現(xiàn)時,到這些類的實(shí)例處獲取這些信息即可。

2) 板級配置文件。MCCD調(diào)試器不但要支持對芯片內(nèi)部資源的調(diào)試操作,還要支持對板卡上資源的調(diào)試操作。這些操作包括:燒寫/擦除片外Flash、讀/寫DDR等。若板卡上包含多個HXDSP芯片,MCCD要支持對所有HXDSP芯片的多核調(diào)試。而片外資源對每種板卡都是不同的,且和芯片類型并沒有直接關(guān)系。因此,設(shè)計板級配置描述XML文件,用來描述板卡上的資源信息。

該XML文件描述的信息包括:(1) 板上芯片的數(shù)量、每個芯片的ID等;(2) 片外Flash的種類,如SPI、并口,I2C ROM等;(3) Flash信息,包括頁大小、扇區(qū)大小、塊大小等;(4) DDR的物理地址、大小、配置信息等。

板級描述XML文件遵守多核聯(lián)盟(MCA:Multicore Association)定義的SHIM軟硬件接口標(biāo)準(zhǔn)[26-27]。多核聯(lián)盟是由多家商業(yè)公司和學(xué)術(shù)機(jī)構(gòu)組成的國際組織,致力于硬件描述文件、運(yùn)行時API接口等軟硬件接口的標(biāo)準(zhǔn)化。SHIM標(biāo)準(zhǔn)的目標(biāo)是為日益多樣化的多核、多處理器、多板卡硬件資源定義一種統(tǒng)一的描述標(biāo)準(zhǔn),以方便上層軟件以統(tǒng)一的方式使用不同的硬件資源。板卡描述XML文件主要定義板卡上的互聯(lián)關(guān)系,互聯(lián)關(guān)系信息中指定連接的器件的XML文件名稱。每個器件有一個單獨(dú)的XML文件來描述,如果一個器件被多個板卡使用,則只需要一份描述該器件信息的XML文件即可。圖7是板級互聯(lián)關(guān)系XML文件的片斷示例。該示例中定義了兩個DDR連接關(guān)系、一個并口Flash設(shè)備連接關(guān)系。DDR設(shè)備連接關(guān)系記錄了DDR顆粒的XML描述文件名稱,以及連接到芯片上的哪個DDR接口。Flash設(shè)備連接關(guān)系記錄了Flash的XML描述文件以及連接到的芯片并行接口。該文件中還會記錄DSP芯片的個數(shù)、種類以及芯片描述XML文件的名稱。

2.6 擴(kuò)展性

硬件架構(gòu)以及板卡配置相關(guān)信息在配置文件中描述。MCCD根據(jù)這些配置文件實(shí)現(xiàn)與硬件有關(guān)的調(diào)試操作。MCCD的主體代碼只與調(diào)試功能實(shí)現(xiàn)流程、調(diào)試信息管理、硬件配置信息管理有關(guān)。若要擴(kuò)展到其他架構(gòu)的處理器,只需要修改硬件配置文件,并對MCCD的代碼進(jìn)行局部修改即可。具體需要修改的模塊包括:通信協(xié)議管理模塊、反匯編模塊、芯片配置信息管理模塊。根據(jù)不同芯片對調(diào)試時內(nèi)核運(yùn)行控制的方式不同,可能還需要對“運(yùn)行控制模塊”進(jìn)行適配和改造。對這些模塊的修改都不需要修改原有代碼,只需要在這些模塊的接口基類的基礎(chǔ)上繼承產(chǎn)生一個新子類即可。

3 結(jié) 語

本文描述了一款自主可控調(diào)試器軟件的架構(gòu)設(shè)計方案,并比較了該調(diào)試器軟件與開源調(diào)試器軟件GDB相比的特點(diǎn)。該調(diào)試器軟件已經(jīng)成功應(yīng)用于“魂芯”各型號DSP,并支持基于可視化開發(fā)環(huán)境的調(diào)試功能。該調(diào)試器軟件相比GDB,命令行接口不夠豐富,但在集群調(diào)試等功能點(diǎn)上也有自己的特色。該調(diào)試器軟件的代碼量少,架構(gòu)靈活,可以同時調(diào)試多種不同架構(gòu)的芯片。通過修改芯片配置XML文件、板級配置XML文件,并對少數(shù)模塊進(jìn)行移植,該調(diào)試器軟件可以很容易地移植到其他硬件架構(gòu)的處理器。該調(diào)試器軟件的架構(gòu)設(shè)計值得國內(nèi)自主可控調(diào)試器軟件開發(fā)設(shè)計人員借鑒參考。

猜你喜歡
基類子類調(diào)試
基于C#面向?qū)ο蟪绦蛟O(shè)計的封裝、繼承和多態(tài)分析
卷入Hohlov算子的某解析雙單葉函數(shù)子類的系數(shù)估計
基于航拍無人機(jī)的設(shè)計與調(diào)試
電子制作(2018年12期)2018-08-01 00:47:44
關(guān)于對稱共軛點(diǎn)的倒星象函數(shù)某些子類的系數(shù)估計
FOCAS功能在機(jī)床調(diào)試中的開發(fā)與應(yīng)用
無線通信中頻線路窄帶臨界調(diào)試法及其應(yīng)用
電子制作(2017年19期)2017-02-02 07:08:38
空戰(zhàn)游戲設(shè)計實(shí)例
調(diào)壓柜的調(diào)試與試運(yùn)行探討
一種基于用戶興趣的STC改進(jìn)算法
虛機(jī)制在《面向?qū)ο蟪绦蛟O(shè)計C++》中的教學(xué)方法研究
灵山县| 浮山县| 北辰区| 阜新市| 新建县| 唐海县| 奉化市| 修水县| 长沙县| 平南县| 博湖县| 伊金霍洛旗| 台江县| 临沧市| 萨迦县| 华池县| 金秀| 礼泉县| 全椒县| 湖北省| 望奎县| 新营市| 广南县| 铁力市| 邵武市| 衡水市| 大理市| 鸡东县| 苗栗县| 宜昌市| 嘉义县| 慈溪市| 来宾市| 安顺市| 定边县| 勃利县| 象山县| 万安县| 永年县| 车致| 探索|