|
BWDSP是一款我國自主研發(fā)的多核高性能通用DSP。BWDSP的體系結(jié)構(gòu)、指令集、配套基礎(chǔ)軟件全部由中電38所自主設(shè)計(jì)開發(fā)。BWDSP的配套基礎(chǔ)軟件包括匯編器、編譯器、調(diào)試器、集成開發(fā)環(huán)境、芯片模擬器等等。BWDSP芯片的調(diào)試器軟件包括主機(jī)調(diào)試器軟件和調(diào)試鏈接服務(wù)軟件兩部分。調(diào)試鏈接服務(wù)軟件運(yùn)行于ICE(In Circuit Emulator)上,起到主機(jī)與芯片之間通信互聯(lián)的功能。而主機(jī)調(diào)試器軟件是調(diào)試系統(tǒng)的核心,負(fù)責(zé)解析用戶命令、分析調(diào)試信息、管理可執(zhí)行文件、管理斷點(diǎn)(和觀察點(diǎn))、單步調(diào)試控制等等[1]。BWDSP的調(diào)試系統(tǒng)支持匯編級調(diào)試和C語言級調(diào)試。在開發(fā)BWDSP芯片調(diào)試系統(tǒng)的C語言單步調(diào)試功能的過程中,研發(fā)人員分析了國內(nèi)外類似工作的可取之外和不足之處,自主創(chuàng)新開發(fā)出實(shí)現(xiàn)方案。 國內(nèi)已經(jīng)陸續(xù)有研究機(jī)構(gòu)自主創(chuàng)新開始調(diào)試系統(tǒng)的研發(fā)工作[2-7],但這些工作在實(shí)現(xiàn)C語言單步調(diào)試方面都存在一些不足。文獻(xiàn)[2-3]中的單步調(diào)試功能是匯編語言級的單步調(diào)試。文獻(xiàn)[7]中的調(diào)試系統(tǒng)雖然實(shí)現(xiàn)了C語言級單步調(diào)試功能,但并未充分考慮到C語言一行代碼可能的復(fù)雜性,只能實(shí)現(xiàn)簡單C語言代碼的單步調(diào)試功能。本文提出的方案充分考慮了C語言單步調(diào)試需要面臨的問題,可以實(shí)現(xiàn)任意復(fù)雜程序的C語言代碼行的單步調(diào)試功能。本方案原理簡單,容易理解,并經(jīng)過大量BWDSP芯片調(diào)試過程的檢驗(yàn),已經(jīng)證明了其正確性。 1。單步調(diào)試功能簡介 單步調(diào)試指以源代碼行為單位對被調(diào)試程序的運(yùn)行進(jìn)行控制的調(diào)試功能。單步調(diào)試不需要用戶顯式地設(shè)置斷點(diǎn),可以控制程序運(yùn)行一個(gè)或若干個(gè)代碼行。通過這種方式,用戶可以結(jié)合變量查看、堆棧查看、觀察點(diǎn)等調(diào)試功能,把潛在的程序錯(cuò)誤定位至某個(gè)代碼行。單步調(diào)試功能一般分為兩大類:匯編級單步調(diào)試功能和源代碼級單步調(diào)試功能。匯編級單步調(diào)試功能指單步調(diào)試控制運(yùn)行的單位是匯編語言的代碼行。源代碼級單步調(diào)試指單步調(diào)試控制運(yùn)行的單位是高級語言源代碼中的代碼行。每類單步調(diào)試功能一般又包括三種:跳入、跳過、跳出。 對于匯編級單步調(diào)試,三種單步調(diào)試功能的實(shí)現(xiàn)較為簡單,其功能概述如下: 跳入調(diào)試功能控制被調(diào)試程序運(yùn)行至當(dāng)前代碼行中調(diào)用的函數(shù)內(nèi)部。若當(dāng)前代碼行中無函數(shù)調(diào)用,則控制被調(diào)試程序運(yùn)行完當(dāng)前代碼行。 跳過指控制被調(diào)試程序運(yùn)行完當(dāng)前代碼行。若當(dāng)前代碼行中有函數(shù)調(diào)用,則控制被調(diào)試程序執(zhí)行完該函數(shù)調(diào)用并繼續(xù)運(yùn)行完當(dāng)前代碼行。 跳出指控制被調(diào)試程序運(yùn)行至當(dāng)前函數(shù)的返回地址處。 對于高級語言如C語言,其三種單步調(diào)試功能從總體概念上和匯編級單步調(diào)試功能類似。但由于C語言一行代碼經(jīng)編譯后生成一段匯編指令,且一行代碼中的語句可能非常復(fù)雜,其單步調(diào)試功能相對于匯編級單步調(diào)試更為復(fù)雜。C語言單步調(diào)試功能的實(shí)現(xiàn)要面對如下幾個(gè)問題: 1.程序當(dāng)前PC(Program Counter,指程序地址)并不一定在一行代碼的最開始處,而有可能在一行代碼生成的一段匯編指令的中間位置。用戶有可能先通過匯編級調(diào)試功能使PC停在C語言代碼行的中間位置,然后再進(jìn)行C語言級單步調(diào)試。 2.一行代碼中可能不止一個(gè)函數(shù)調(diào)用。C語言中一行代碼中可以有任意多個(gè)函數(shù)調(diào)用。 3.一行代碼可能有多個(gè)return語句。C語言中,一行代碼中可以寫任意長的代碼,其中可能包含若干個(gè)條件控制語句(if…else…),每種條件下都可能有一個(gè)return語句,程序有可能從其中任意一個(gè)return語句處從本函數(shù)返回。 4.一行代碼可能有多個(gè)出口。若代碼行處于循環(huán)之中,則代碼行中每個(gè)break(或continue)語句都可以跳出本行。若代碼行中有多個(gè)break(或continue)語句,則程序可能從其中任意一個(gè)位置離開本行。 5.一行代碼中的出口有可能是條件跳轉(zhuǎn)的出口,程序并不一定從該出口跳出。條件跳轉(zhuǎn)根據(jù)運(yùn)行時(shí)的具體情況來判斷是否需要跳轉(zhuǎn),有可能跳轉(zhuǎn),也有可能不跳轉(zhuǎn)。 6.函數(shù)調(diào)用有可能以函數(shù)指針的方式實(shí)現(xiàn)。C語言中定義有函數(shù)指針,通過函數(shù)指針進(jìn)行函數(shù)調(diào)用同樣是函數(shù)調(diào)用的一種方式,跳入功能的實(shí)現(xiàn)必須考慮這種情況。 7.程序的執(zhí)行可能不是簡單的順序執(zhí)行。用戶可以把一個(gè)完整的循環(huán)寫到一行代碼中,因此程序流可能不是順序執(zhí)行的,有可能回到本代碼行中已經(jīng)執(zhí)行過的某個(gè)程序位置繼續(xù)執(zhí)行。C語言級單步調(diào)試功能的實(shí)現(xiàn)不能依賴于程序流的順序執(zhí)行。 8.一行代碼有可能沒有下一行代碼。如一行代碼位于函數(shù)體或源文件的最后一行,則該行代碼是沒有下一行代碼的。運(yùn)行完該行代碼后程序流只會(huì)返回到上一層函數(shù),或跳轉(zhuǎn)至本函數(shù)中其他位置。 9.單步調(diào)試過程中可能由于其他原因使調(diào)試過程提前結(jié)束。若用戶設(shè)置了斷點(diǎn)或觀察點(diǎn),單步調(diào)試過程中可能引起這些斷點(diǎn)(或觀察點(diǎn))的觸發(fā),使單步調(diào)試過程提前結(jié)束。 由于C語言單步調(diào)試功能面臨這些復(fù)雜的問題,因此C語言單步調(diào)試功能的實(shí)現(xiàn)遠(yuǎn)比匯編級單步調(diào)試功能的實(shí)現(xiàn)要復(fù)雜。 2 方案概述 2.1 已有方案介紹 目前,單步調(diào)試功能的實(shí)現(xiàn)方案分為兩大類。一類通過不斷控制程序流按匯編指令行逐行執(zhí)行,進(jìn)行匯編級單步執(zhí)行,每執(zhí)行一行匯編代碼就控制被調(diào)試程序停下來,分析程序地址,根據(jù)當(dāng)前程序地址判斷單步調(diào)試功能是否完成。另一類方案通過反匯編當(dāng)前源代碼行生成的匯編程序段,尋找其中的函數(shù)調(diào)用、出口地址,在這些位置設(shè)置臨時(shí)斷點(diǎn)。設(shè)置完臨時(shí)斷點(diǎn)后,控制程序正常運(yùn)行,直至遇到斷點(diǎn)停止為止。程序遇到斷點(diǎn)停止又有分為幾種情況,若斷點(diǎn)是用戶顯式設(shè)置的斷點(diǎn),說明在單步調(diào)試的過程中遇到用戶斷點(diǎn),一次單步調(diào)試結(jié)束。若斷點(diǎn)是為本次單步調(diào)試設(shè)置的臨時(shí)斷點(diǎn),一次單步調(diào)試正常結(jié)束。單步調(diào)試結(jié)束后,還要把為本次單步調(diào)試設(shè)置的臨時(shí)斷點(diǎn)全部刪除。 第一種方案的優(yōu)點(diǎn)是實(shí)現(xiàn)簡單,容易理解。但是,若源代碼行中的代碼很復(fù)雜,生成的匯編程序段內(nèi)容很大,使用第一種方案將使程序反復(fù)處于運(yùn)行和停止?fàn)顟B(tài),調(diào)試效率不高。芯片執(zhí)行匯編級單步運(yùn)行的速度也遠(yuǎn)遠(yuǎn)小于正常運(yùn)行的速度。尤其是針對嵌入式系統(tǒng)的一些遠(yuǎn)程調(diào)試系統(tǒng),調(diào)試器和被調(diào)試程序運(yùn)行在不同的機(jī)器上,通過串口或網(wǎng)口進(jìn)行通信,第一種方法將帶來大量的通信負(fù)擔(dān)。顯然,對于一個(gè)高效的嵌入式系統(tǒng)調(diào)試器,使用第一種方法是不可行的。本文介紹的單步調(diào)試功能實(shí)現(xiàn)方法屬于第二類方案。 國內(nèi)已經(jīng)有少數(shù)研究機(jī)構(gòu)開展單步調(diào)試功能的研究,但這些研究并未能完全解決C語言單步調(diào)試功能面臨的所有問題。文獻(xiàn)[4-5]按第一種方案實(shí)現(xiàn)了一款調(diào)試器的單步調(diào)試功能,顯然這種實(shí)現(xiàn)方式具有不可避免的通信負(fù)擔(dān)。文獻(xiàn)[6]實(shí)現(xiàn)了一款基于串口通信的嵌入式調(diào)試系統(tǒng),其單步調(diào)試功能也是基于第一種方案。文獻(xiàn)[7]較為完整地介紹了一款調(diào)試器中單步調(diào)試功能的實(shí)現(xiàn),其實(shí)現(xiàn)方案屬于上述第二類方案,基本完成了C語言調(diào)試的主要功能。但該項(xiàng)工作并未考慮到C語言中單步調(diào)試功能的復(fù)雜性,未能解決上節(jié)介紹的第1、6、7、8、9等問題。若被調(diào)試代碼中包含較為復(fù)雜的代碼,該款調(diào)試器的單步調(diào)試功能將不能正確完成。 2.2 幾種出口類型介紹 BWDSP芯片調(diào)試系統(tǒng)軟件在充分調(diào)研了國內(nèi)外前人工作的基礎(chǔ)上,參考已經(jīng)成功實(shí)現(xiàn)的方案,自主實(shí)現(xiàn)了C語言單步調(diào)試功能。BWDSP芯片配套調(diào)試系統(tǒng)軟件的單步調(diào)試功能基于在代碼行出口處設(shè)置臨時(shí)斷點(diǎn)的方案實(shí)現(xiàn)。與國內(nèi)外已有工作相比,該方案充分考慮了C語言代碼行中的代碼復(fù)雜性,可以解決第1節(jié)中列舉的9種問題。 BWDSP芯片配套調(diào)試系統(tǒng)把一行C語言代碼行的出口分為如下幾類: 1:通過for、while循環(huán)、break、continue語句跳轉(zhuǎn)至其他代碼行,該類出口稱為L(Label)類出口,其出口地址集記為L。C語言中的這些跳轉(zhuǎn)指令最終編碼為BWDSP芯片指令集中的跳轉(zhuǎn)指令。BWDSP芯片指令集中的跳轉(zhuǎn)指令分為四類:①條件跳轉(zhuǎn):跳轉(zhuǎn)有可能發(fā)生,也可能不發(fā)生,根據(jù)運(yùn)行時(shí)的計(jì)算結(jié)果或寄存器值確定;②絕對跳轉(zhuǎn):跳轉(zhuǎn)一定會(huì)發(fā)生,跳轉(zhuǎn)目的地址在指令機(jī)器碼中編碼;③相對跳轉(zhuǎn):跳轉(zhuǎn)一定會(huì)發(fā)生,跳轉(zhuǎn)目的地址是當(dāng)前地址加上一個(gè)偏移;④寄存器跳轉(zhuǎn),跳轉(zhuǎn)一定會(huì)發(fā)生,跳轉(zhuǎn)目的地址是某個(gè)寄存器中的值,不能從可執(zhí)行文件程序段獲取。對于第①②③類跳轉(zhuǎn),其目的地址可以從程序段反匯編得到。而對第④類跳轉(zhuǎn),其目的地址不能從程序段得到,需要在運(yùn)行時(shí)從某個(gè)寄存器中讀取。 2:通過函數(shù)調(diào)用跳轉(zhuǎn)至其他行,這類出口稱為F(Function)類出口,這些函數(shù)的入口地址集記為F。C語言中的函數(shù)調(diào)用最終被編碼為BWDSP芯片指令集中的函數(shù)調(diào)用指令。BWDSP指令集中的函數(shù)調(diào)用指令分為兩類:①絕對地址函數(shù)調(diào)用:函數(shù)調(diào)用的入口地址編碼在指令中,可以從程序段得到;②寄存器函數(shù)調(diào)用:函數(shù)調(diào)用的入口地址是調(diào)用時(shí)某個(gè)寄存器中的值。一般,直接調(diào)用C語言中的函數(shù)會(huì)編譯為第一類函數(shù)調(diào)用指令;通過函數(shù)指針調(diào)用函數(shù)會(huì)編譯為第二類函數(shù)調(diào)用指令。同樣,第一類函數(shù)調(diào)用的入口地址可以通過反匯編程序段得到,而第二類函數(shù)調(diào)用的入口地址只能在運(yùn)行時(shí)讀取某個(gè)寄存器中的值獲得。 3:通過return語句跳轉(zhuǎn)至本幀的返回地址,這類出口稱為R(Return)類出口,返回地址記為R。一個(gè)函數(shù)可能有多個(gè)retrun語句,一行C語言代碼中也可能有多處函數(shù)返回。但由于程序流一定處于函數(shù)調(diào)用棧中的棧頂,該函數(shù)返回后肯定返回至上一幀的現(xiàn)場,所以當(dāng)前PC所處的函數(shù)中的多處return語句其實(shí)返回到同一個(gè)地址。而且,由于函數(shù)可能在多處被調(diào)用,所以該返回地址不能通過反匯編程序段獲得,只能通過運(yùn)行時(shí)函數(shù)調(diào)用棧獲得。 4:直接運(yùn)行完本行代碼來到的程序地址,這類出口稱為N(Next),其出口地址記為N。程序運(yùn)行完當(dāng)前行后,會(huì)自然地運(yùn)行下一行的指令,因此下一行指令的開始地址也是本行代碼的一個(gè)出口地址。對于部分C語言代碼行,并沒有下一行出口地址。例如,若一個(gè)代碼行是一函數(shù)的最后一行,若執(zhí)行該行代碼時(shí),或者跳轉(zhuǎn)至其他行,或返回調(diào)用函數(shù),肯定不會(huì)進(jìn)入下一行代碼執(zhí)行。所以,本類出口可能存在,也可能不存在。 在將一行C語言代碼行的出口分為以上四類的基礎(chǔ)上,BWDSP調(diào)試系統(tǒng)通過在這些出口上設(shè)置臨時(shí)斷點(diǎn)實(shí)現(xiàn)單步調(diào)試功能。設(shè)置的臨時(shí)斷點(diǎn)位置不同,實(shí)現(xiàn)的單步調(diào)試功能也不同。對有些特殊的出口,除了設(shè)置臨時(shí)斷點(diǎn),還要做一些特殊處理。下一節(jié)將對三種單步調(diào)試功能的實(shí)現(xiàn)方法進(jìn)行具體介紹。 3 具體實(shí)現(xiàn) 3.1 跳出 跳出是實(shí)現(xiàn)方式最簡單的單步調(diào)試功能,其功能是跳出當(dāng)前函數(shù),來到其返回地址處。由于一個(gè)函數(shù)在運(yùn)行時(shí)返回地址只有一個(gè),即R,所以只需要在R處設(shè)置一個(gè)臨時(shí)斷點(diǎn),然后讓被調(diào)試程序正常運(yùn)行即可。當(dāng)程序遇到斷點(diǎn)停下時(shí),若該斷點(diǎn)為用戶設(shè)置的斷點(diǎn),說明單步調(diào)試過程中用戶斷點(diǎn)觸發(fā),跳出單步調(diào)試結(jié)束。若該斷點(diǎn)為臨時(shí)斷點(diǎn)R,說明跳出功能正常實(shí)現(xiàn),單步調(diào)試結(jié)束。該方案可以解決第1節(jié)中介紹的第3、9點(diǎn)問題,而其他問題對跳出單步調(diào)試功能沒有影響。 圖1 跳出單步調(diào)試功能實(shí)現(xiàn)流程圖 若當(dāng)前函數(shù)是主函數(shù)main函數(shù),則函數(shù)棧中只有一幀,無需設(shè)置臨時(shí)斷點(diǎn),直接運(yùn)行即可。 跳出單步調(diào)試功能的實(shí)現(xiàn)方案流程如圖1所示。 3.2 跳過 跳過功能使程序執(zhí)行完當(dāng)前代碼行。若本代碼行中有函數(shù)調(diào)用,則執(zhí)行完該函數(shù),并返回本代碼行繼續(xù)運(yùn)行,直至程序自然地跳出該代碼行為止。所以,跳過單步調(diào)試功能應(yīng)在L、N類出口設(shè)置臨時(shí)斷點(diǎn)。 圖2 跳過單步調(diào)試功能實(shí)現(xiàn)流程圖 一般,C語言程序在進(jìn)入函數(shù)和跳出函數(shù)時(shí)會(huì)有一小段代碼用來進(jìn)行函數(shù)棧入棧和出棧的操作。這一小段代碼在調(diào)試信息中一般與源代碼中函數(shù)開始和結(jié)束時(shí)的正反大括號對應(yīng)。單步調(diào)試時(shí),若代碼行中有return語句,該語句實(shí)際上被編譯為一個(gè)跳轉(zhuǎn)語句,跳轉(zhuǎn)至函數(shù)結(jié)尾的大括號處,并不會(huì)真正返回上一層調(diào)用函數(shù)。若代碼行中有函數(shù)結(jié)束時(shí)的大括號,則程序在該代碼行中真正有可能返回調(diào)用函數(shù)。返回上一層調(diào)用函數(shù)的指令在BWDSP指令集中被編碼為RET指令,因此可以通過檢查代碼行中是否有RET指令判斷該代碼行是否有可能返回調(diào)用函數(shù)。若代碼行中有RET指令,還要在R類出口處設(shè)置斷點(diǎn)。該方法可以解決第1節(jié)中介紹的第8個(gè)問題。 程序PC即使在一行代碼中間某個(gè)位置,也有可能跳回到該行代碼的開始位置繼續(xù)執(zhí)行。設(shè)置臨時(shí)斷點(diǎn)時(shí),需要在該行代碼中的全部L類出口處都設(shè)置斷點(diǎn),不管該跳轉(zhuǎn)指令是在當(dāng)前PC之前還是之后。這種方案可以解決第1、7個(gè)問題。 對于L類出口中的第①類跳轉(zhuǎn)(條件跳轉(zhuǎn))出口,不論該跳轉(zhuǎn)是否會(huì)發(fā)生,都在該出口處設(shè)置臨時(shí)斷點(diǎn)。若程序執(zhí)行了該條件跳轉(zhuǎn),本方案可以使跳過單步調(diào)試功能正常結(jié)束。若程序沒有執(zhí)行該條件跳轉(zhuǎn),設(shè)置的該臨時(shí)斷點(diǎn)也不會(huì)對單步調(diào)試功能產(chǎn)生影響。這種方案解決了第5個(gè)問題。 對于L類出口中的第④類跳轉(zhuǎn)(寄存器跳轉(zhuǎn)),其出口地址不能在運(yùn)行之前獲得,因此也不能在出口處設(shè)置臨時(shí)斷點(diǎn)。對這類跳轉(zhuǎn),需要在其跳轉(zhuǎn)指令處設(shè)置臨時(shí)斷點(diǎn),若該臨時(shí)斷點(diǎn)觸發(fā),讀取其跳轉(zhuǎn)目的地址寄存器的值。若讀到的跳轉(zhuǎn)目的地址在本行代碼中,則保留所有已經(jīng)設(shè)置的臨時(shí)斷點(diǎn),繼續(xù)運(yùn)行程序。若該跳轉(zhuǎn)的目的地址不在本行代碼中,則控制程序進(jìn)行一次匯編級指令行單步以執(zhí)行該跳轉(zhuǎn),然后結(jié)束本次單步調(diào)試過程。 由于本方案沒有在函數(shù)調(diào)用出口出設(shè)置斷點(diǎn),若源代碼行中有多個(gè)函數(shù)調(diào)用,這些函數(shù)調(diào)用會(huì)依次執(zhí)行,不會(huì)觸發(fā)斷點(diǎn)。因此,本方案可以解決第2個(gè)問題。 被調(diào)試程序觸發(fā)以上設(shè)置的臨時(shí)斷點(diǎn)中的任意一個(gè),都意味著單步跳過調(diào)試過程的結(jié)束。所以,只要臨時(shí)斷點(diǎn)位置是代碼行的合法可能出口,設(shè)置多個(gè)臨時(shí)斷點(diǎn)不會(huì)對單步調(diào)試功能的正確性產(chǎn)生影響。顯然,該方案可以解決第4個(gè)問題。 本方案解決了第1節(jié)中介紹的第1、2、3、4、5、7、8、9問題,而第6個(gè)問題不會(huì)對跳過單步調(diào)試功能產(chǎn)生影響。跳過單步調(diào)試的實(shí)現(xiàn)方案流程如圖2所示。 3.3跳入 跳入調(diào)試功能使程序可以進(jìn)入代碼行中調(diào)用的函數(shù)內(nèi)部。若程序在當(dāng)前代碼行中的執(zhí)行過程中沒有遇到函數(shù)調(diào)用,則執(zhí)行完本代碼行即完成單步調(diào)試功能,此時(shí)其調(diào)試功能與跳過單步調(diào)試類似。顯然,實(shí)現(xiàn)單步跳入調(diào)試功能需要在L、F、R、N處都設(shè)置臨時(shí)斷點(diǎn)。 對于F類出口中的第②類函數(shù)調(diào)用(寄存器函數(shù)調(diào)用),同樣需要在函數(shù)調(diào)用指令處設(shè)置臨時(shí)斷點(diǎn)。當(dāng)該臨時(shí)斷點(diǎn)觸發(fā)時(shí),控制程序進(jìn)行一次匯編級指令行單步,使程序進(jìn)入調(diào)用函數(shù)。該方法可以解決第6個(gè)問題。 圖3 跳入單步調(diào)試功能實(shí)現(xiàn)流程圖 由于本方案在所有函數(shù)調(diào)用處都設(shè)置了斷點(diǎn),所以程序會(huì)停止在執(zhí)行過程中的第一個(gè)函數(shù)調(diào)用出口。調(diào)試行為表現(xiàn)為程序會(huì)跳入執(zhí)行過程中遇到的第一個(gè)函數(shù)。 第1節(jié)中介紹的所有問題都對跳入單步調(diào)試功能有影響,而本方案可以解決所有9個(gè)問題。 跳入調(diào)試功能的實(shí)現(xiàn)流程如圖3所示。 3.4 實(shí)驗(yàn)結(jié)果 BWDSP芯片配套調(diào)試系統(tǒng)的C語言單步調(diào)試功能按照本文介紹的方案實(shí)施。開發(fā)人員以任意復(fù)雜的C語言代碼行在各種復(fù)雜的調(diào)試場景下對單步調(diào)試功能進(jìn)行測試,調(diào)試系統(tǒng)均可按單步調(diào)試預(yù)定義的功能完成調(diào)試過程。目前,在BWDSP芯片的模擬器、編譯器、操作系統(tǒng)開發(fā)過程中,均已經(jīng)在項(xiàng)目組內(nèi)部試用本調(diào)試器進(jìn)行C語言級調(diào)試。經(jīng)過反復(fù)測試、試用、修改,本方案已經(jīng)證實(shí)是一個(gè)健壯的實(shí)施方案,可以實(shí)現(xiàn)任意復(fù)雜C語言代碼行的單步調(diào)試功能。 總結(jié) 本文介紹了BWDSP芯片調(diào)試系統(tǒng)中C語言單步調(diào)試功能的實(shí)現(xiàn)方案。該方案充分研究了C語言一行源代碼中可能對單步調(diào)試功能產(chǎn)生影響的各種情況,充分考慮了C語言代碼行的復(fù)雜性,可以實(shí)現(xiàn)任意復(fù)雜C語言代碼行的單步調(diào)試功能。經(jīng)BWDSP芯片調(diào)試過程的驗(yàn)證,證實(shí)了本方案的有效性。 [1]黃光紅,劉冠南。可配置多核處理器的調(diào)試器模塊化分層設(shè)計(jì)[J]。單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2014,14(7):13-15。 [2]向征。基于C30的嵌入式計(jì)算機(jī)自主調(diào)試環(huán)境的建立和軟件設(shè)計(jì)[J]。微電子學(xué)與計(jì)算機(jī),1999,3,18-20,56。 [3]文躍榮。基于UART的電能芯片在線調(diào)試設(shè)計(jì)[D]。湖南大學(xué),2012。 [4]劉曉升,王宜懷。HC08系列微控制器在線調(diào)試的關(guān)鍵技術(shù)分析[J]。計(jì)算機(jī)工程與設(shè)計(jì),2009,30(3),532-535。 [5]龔蘭蘭,劉曉升,朱巧明。遠(yuǎn)程調(diào)試系統(tǒng)的關(guān)鍵技術(shù)分析[J]。計(jì)算機(jī)應(yīng)用與軟件,2010,27(10),258-261。 [6]梁泉。嵌入式系統(tǒng)交叉調(diào)試器的設(shè)計(jì)與實(shí)現(xiàn)[D]。電子科技大學(xué),2008。 [7]趙民棟。嵌入式軟件集成開發(fā)環(huán)境中調(diào)試器的設(shè)計(jì)與實(shí)現(xiàn)[D]。西北工業(yè)大學(xué),2004。 |