亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

        2023-06-07 09:42:44林廣棟黃光紅趙紀(jì)堂郭利鋒
        關(guān)鍵詞:調(diào)試功能

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

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

        0 引 言

        計(jì)算機(jī)軟件誕生之初,調(diào)試器就是軟件開發(fā)人員的重要工具。最初的調(diào)試器是基于硬件直接實(shí)現(xiàn)的,通過硬件設(shè)備提供計(jì)算機(jī)底層的信息。直到計(jì)算機(jī)基礎(chǔ)軟件(如操作系統(tǒng)、編譯器)發(fā)展成熟到一定程度之后,用戶友好的開源或商業(yè)化調(diào)試軟件才出現(xiàn)。調(diào)試器的工作原理是基于處理器的硬件機(jī)制,或基于操作系統(tǒng)封裝后的異常處理機(jī)制,結(jié)合編譯器生成的調(diào)試信息,將軟件的狀態(tài)以方便的方式提供給軟件開發(fā)人員,并支持軟件開發(fā)人員對(duì)正在調(diào)試的軟件的狀態(tài)進(jìn)行修改。調(diào)試器的基本功能包括控制軟件運(yùn)行、查看軟件運(yùn)行時(shí)的信息、修改軟件執(zhí)行流程或狀態(tài)等。先進(jìn)的調(diào)試器還會(huì)添加事件分析、向后運(yùn)行等功能。時(shí)至今時(shí),應(yīng)用于計(jì)算機(jī)各領(lǐng)域的調(diào)試系統(tǒng)仍然在不斷發(fā)展中,各種新技術(shù)層出不窮[1-9]。近年來的創(chuàng)新點(diǎn)主要集中在針對(duì)新型架構(gòu)處理器的調(diào)試技術(shù)[3]、針對(duì)區(qū)塊鏈軟件的調(diào)試技術(shù)[5]、針對(duì)虛擬仿真環(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可以對(duì)嵌入式處理器進(jìn)行調(diào)試操作,如查看/修改寄存器、查看/修改內(nèi)存、暫停/運(yùn)行處理器等等。結(jié)合GNU的另一個(gè)工具GDBServer,還可以調(diào)試遠(yuǎn)端Linux系統(tǒng)上運(yùn)行的進(jìn)程。GDB是開源軟件,已經(jīng)被很多處理器廠商移植用于嵌入式處理器的調(diào)試,是目前使用最廣泛的調(diào)試工具[13-16]。但GDB對(duì)由數(shù)百片芯片組合而成的處理器陣列的調(diào)試功能支持不夠完善。

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

        美國(guó)的Green Hills公司是業(yè)界領(lǐng)先的嵌入式軟件平臺(tái)和開發(fā)環(huán)境供應(yīng)商,專注于研發(fā)嵌入式編譯器、調(diào)試器、操作系統(tǒng)、開發(fā)環(huán)境[19]。該公司推出的TimeMachine調(diào)試套件是業(yè)界首個(gè)為開發(fā)人員在程序運(yùn)行的時(shí)間維度上提供向前和向后完全可視性的調(diào)試器。該調(diào)試器可以在程序出錯(cuò)時(shí)讓程序按時(shí)間順序向后連續(xù)或單步運(yùn)行,從而快速準(zhǔn)確地找出發(fā)生錯(cuò)誤的地方。該調(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)試器軟件具有代碼量少、對(duì)多核/多芯片/多板卡調(diào)試的支持更完備的特點(diǎn)。

        1 簡(jiǎn) 介

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

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

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

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

        GDB相比MCCD,命令行接口更為豐富,且支持對(duì)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既支持對(duì)本機(jī)運(yùn)行的程序進(jìn)行調(diào)試,也支持通過RSP協(xié)議對(duì)遠(yuǎn)程運(yùn)行的程序進(jìn)行調(diào)試。大多數(shù)嵌入式芯片的開發(fā)環(huán)境都通過移植GDB來支持調(diào)試。常見的做法是新增一個(gè)協(xié)議轉(zhuǎn)換軟件,該軟件一方面通過RSP協(xié)議與GDB進(jìn)行通信,一方面通過私有協(xié)議與嵌入式調(diào)試硬件進(jìn)行通信。MCCD與GDB在調(diào)試功能上的對(duì)比結(jié)果見表1??梢钥闯?相對(duì)于GDB,MCCD在處理器集群調(diào)試方面具有一些獨(dú)特的優(yōu)勢(shì)。

        2 設(shè) 計(jì)

        2.1 架構(gòu)介紹

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

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

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

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

        各模塊的功能簡(jiǎn)介如表2所示。

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

        續(xù)表2

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

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

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

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

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

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

        (5) 向MemoryManage模塊發(fā)送讀取內(nèi)存請(qǐng)求,此時(shí)的內(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)存請(qǐng)求。此時(shí)內(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è)計(jì)

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

        IRemoteComm是TargetDebug內(nèi)部使用的與硬件仿真器或芯片模擬器通信模塊接口。如圖4所示,IRemoteComm是一個(gè)包含純虛函數(shù)的基類,它有兩個(gè)子類UDPRemoteComm和TCPRemoteComm。這兩個(gè)子類中會(huì)定義實(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在開啟一個(gè)調(diào)試會(huì)話時(shí),根據(jù)用戶的選擇來決定實(shí)例化UDPRemoteComm還是TCPRemoteComm。MCCDDebugger中的實(shí)現(xiàn)代碼,只調(diào)用IRemoteComm中定義的函數(shù)接口,具體運(yùn)行過程中,會(huì)自動(dòng)調(diào)用其子類中的函數(shù)。

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

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

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

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

        2.4 設(shè)計(jì)模式

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

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

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

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

        2.5 配置文件

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

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

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

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

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

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

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

        板級(jí)描述XML文件遵守多核聯(lián)盟(MCA:Multicore Association)定義的SHIM軟硬件接口標(biāo)準(zhǔn)[26-27]。多核聯(lián)盟是由多家商業(yè)公司和學(xué)術(shù)機(jī)構(gòu)組成的國(guó)際組織,致力于硬件描述文件、運(yùn)行時(shí)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文件名稱。每個(gè)器件有一個(gè)單獨(dú)的XML文件來描述,如果一個(gè)器件被多個(gè)板卡使用,則只需要一份描述該器件信息的XML文件即可。圖7是板級(jí)互聯(lián)關(guān)系XML文件的片斷示例。該示例中定義了兩個(gè)DDR連接關(guān)系、一個(gè)并口Flash設(shè)備連接關(guān)系。DDR設(shè)備連接關(guān)系記錄了DDR顆粒的XML描述文件名稱,以及連接到芯片上的哪個(gè)DDR接口。Flash設(shè)備連接關(guān)系記錄了Flash的XML描述文件以及連接到的芯片并行接口。該文件中還會(huì)記錄DSP芯片的個(gè)數(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)的處理器,只需要修改硬件配置文件,并對(duì)MCCD的代碼進(jìn)行局部修改即可。具體需要修改的模塊包括:通信協(xié)議管理模塊、反匯編模塊、芯片配置信息管理模塊。根據(jù)不同芯片對(duì)調(diào)試時(shí)內(nèi)核運(yùn)行控制的方式不同,可能還需要對(duì)“運(yùn)行控制模塊”進(jìn)行適配和改造。對(duì)這些模塊的修改都不需要修改原有代碼,只需要在這些模塊的接口基類的基礎(chǔ)上繼承產(chǎn)生一個(gè)新子類即可。

        3 結(jié) 語

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

        猜你喜歡
        調(diào)試功能
        也談詩(shī)的“功能”
        基于航拍無人機(jī)的設(shè)計(jì)與調(diào)試
        電子制作(2018年12期)2018-08-01 00:47:44
        關(guān)于非首都功能疏解的幾點(diǎn)思考
        核電廠主給水系統(tǒng)調(diào)試
        懷孕了,凝血功能怎么變?
        媽媽寶寶(2017年2期)2017-02-21 01:21:24
        無線通信中頻線路窄帶臨界調(diào)試法及其應(yīng)用
        電子制作(2017年19期)2017-02-02 07:08:38
        “簡(jiǎn)直”和“幾乎”的表達(dá)功能
        調(diào)壓柜的調(diào)試與試運(yùn)行探討
        工業(yè)電氣設(shè)備控制系統(tǒng)的安裝與調(diào)試
        音頻處理器的調(diào)試
        曰日本一级二级三级人人| 亚洲产国偷v产偷v自拍色戒| 巨爆乳中文字幕爆乳区| 国产精品av网站在线| 国产精品美女久久久网站三级 | 国产精一品亚洲二区在线播放 | 一本大道香蕉最新在线视频| 日韩精品一区二区亚洲av性色| av网页免费在线观看| 国产精品三级av及在线观看| 新久久国产色av免费看| 国产亚洲精品美女久久久m| 亚洲乱码av中文一区二区| 在线观看av国产自拍| 久久精品一区一区二区乱码| 成年免费a级毛片免费看无码| 狠狠色丁香久久婷婷综合蜜芽五月| 人妖另类综合视频网站| 亚洲av熟女少妇一区二区三区| 精品人妻一区二区三区视频| 免费无码高潮流白浆视频| 亚洲av无码成人yellow| 日韩精品一区二区三区在线观看的| 不卡av网站一区二区三区| 97久久草草超级碰碰碰| 乱伦一区二| 国产精品自产拍av在线| 玩弄少妇人妻中文字幕| 亚洲av无码成人黄网站在线观看| 无码av永久免费大全| 亚洲精品偷拍自综合网| 97人人超碰国产精品最新| 亚洲Av午夜精品a区| 中文字幕精品久久一区二区三区| 免费乱理伦片在线观看| 色拍拍在线精品视频| 亚洲av色在线观看网站| 四虎永久在线精品免费一区二区 | 麻豆文化传媒精品一区观看| 把女的下面扒开添视频| 国产又爽又黄的激情精品视频|