CISC處理器調(diào)試系統(tǒng)的設(shè)計(jì)實(shí)現(xiàn),詳細(xì)軟硬件架構(gòu)、流程、代碼
- 前言
隨著嵌入式的不斷發(fā)展,在各個(gè)領(lǐng)域的應(yīng)用越來(lái)越廣泛,由于嵌入式系統(tǒng)的專(zhuān)用性很強(qiáng),所以針對(duì)不同的應(yīng)用的嵌入式軟件的開(kāi)發(fā)在嵌入式系統(tǒng)開(kāi)發(fā)中所占的比重越來(lái)越大。嵌入式系統(tǒng)的開(kāi)發(fā)主要包括兩個(gè)部分硬件設(shè)計(jì)和軟件設(shè)計(jì)。軟件設(shè)計(jì)的步驟主要有源碼編輯、源碼編譯、嵌入式操作系統(tǒng)的配置、程序下載和調(diào)試。由于嵌入式系統(tǒng)的資源有限不可能在嵌入式系統(tǒng)的硬件平臺(tái)上集成自身的軟件開(kāi)發(fā)環(huán)境,所以嵌入式的軟件開(kāi)發(fā)的通常采用交叉編譯和調(diào)試的方式。調(diào)試是保證程序質(zhì)量的重要手段之一,可以驗(yàn)證程序是否滿(mǎn)足預(yù)期的要求和檢查程序存在的bug。交叉的開(kāi)發(fā)方式采用宿主機(jī)和目標(biāo)機(jī)的結(jié)構(gòu)。宿主機(jī)一般采用PC機(jī),將嵌入式系統(tǒng)的軟件開(kāi)發(fā)環(huán)境配置在PC機(jī)上。宿主機(jī)和目標(biāo)機(jī)之間通過(guò)串口、并口和網(wǎng)線等建立連接,不僅僅是物理連接還有邏輯連接。在交叉開(kāi)發(fā)過(guò)程中宿主機(jī)和目標(biāo)機(jī)通過(guò)這種連接進(jìn)行交互,完成目標(biāo)程序的編譯下載和調(diào)試。
嵌入式系統(tǒng)的開(kāi)發(fā)主要針對(duì)硬件系統(tǒng)中的微處理器的嵌入式軟件的開(kāi)發(fā),嵌入式系統(tǒng)的軟件調(diào)試也是針對(duì)微處理器的調(diào)試?,F(xiàn)在微電子技術(shù)飛速發(fā)展,處理器生產(chǎn)工藝也不斷提高,微處理器芯片的集成度更高、運(yùn)行頻率更高,所以對(duì)調(diào)試的要求更高。單單采用PC機(jī)上的軟件調(diào)試器和軟件調(diào)試代理已經(jīng)很難適應(yīng)這些新的變化,將調(diào)試功能轉(zhuǎn)移到硬件部分為嵌入式軟件的開(kāi)發(fā)提供更好的保障和支持,實(shí)現(xiàn)成本也比較低。微處理器芯片中集成支持調(diào)試的硬件邏輯已經(jīng)逐漸成為趨勢(shì)。
在板級(jí)的測(cè)試和調(diào)試領(lǐng)域,為了更好的支持對(duì)電路物理節(jié)點(diǎn)的訪問(wèn),JTAG標(biāo)準(zhǔn)已經(jīng)被很多芯片生產(chǎn)廠商所采用。JTAG標(biāo)準(zhǔn)最早的提出是為了檢測(cè)印刷電路板的元件焊接問(wèn)題,通過(guò)在電路中引入邊界掃描單元所組成的邊界掃描鏈來(lái)完成對(duì)電路節(jié)點(diǎn)的訪問(wèn)。現(xiàn)在JTAG標(biāo)準(zhǔn)也被應(yīng)用于嵌入式軟件的調(diào)試過(guò)程中,用于與硬件調(diào)試邏輯交互提供通用的調(diào)試接口。
- 總體方案設(shè)計(jì)
圖1 系統(tǒng)結(jié)構(gòu)框圖
整個(gè)調(diào)試系統(tǒng)分為四部分PC機(jī)上層控制臺(tái),USB-JTAG協(xié)議轉(zhuǎn)換器,片上調(diào)試器OCD(On Chip Debugger)以及調(diào)試的目標(biāo)處理器CPU。
- 系統(tǒng)硬件
- USB傳輸
USB是以串行傳輸?shù)姆绞絺鬏敂?shù)據(jù),首先使用FTDI公司的USB串并轉(zhuǎn)換芯片F(xiàn)T245R將USB串行數(shù)據(jù)轉(zhuǎn)換為并行數(shù)據(jù),然后USB-JTAG協(xié)議轉(zhuǎn)換器根據(jù)接收到的數(shù)據(jù)按照J(rèn)TAG協(xié)議輸出TAP信號(hào)。USB-JTAG協(xié)議轉(zhuǎn)換器的結(jié)構(gòu)如圖1所示。
圖 1 協(xié)議轉(zhuǎn)換器的結(jié)構(gòu)
USB-JTAG協(xié)議轉(zhuǎn)換器與FT245R之間除了有8位的數(shù)據(jù)Data[7:0]的傳輸,還有四個(gè)握手信號(hào),分別是nRXF、nTXE、nRD和WR,如圖1所示。nRXF是讀FIFO_TX允許信號(hào),nTXE是寫(xiě)FIFO_RX允許信號(hào),還有讀FIFO_TX信號(hào)nRD和寫(xiě)FIFO_RX信號(hào)WR。當(dāng)nRXF為低電平時(shí)說(shuō)明FIFO_TX不為空,USB-JTAG協(xié)議轉(zhuǎn)換器可以從中讀出數(shù)據(jù),此時(shí)USB-JTAG協(xié)議轉(zhuǎn)換器可以通過(guò)發(fā)送nRD信號(hào)從FIFO_TX讀取數(shù)據(jù);同樣當(dāng)nTXE信號(hào)有效的時(shí)候表明FIFO_RX還有空間,此時(shí)USB-JTAG協(xié)議轉(zhuǎn)換器可以使WR信號(hào)有效往FIFO_RX中寫(xiě)入數(shù)據(jù)。USB-JTAG協(xié)議轉(zhuǎn)換器對(duì)FIFO_TX和FIFO_RX的讀寫(xiě)操作都是以字節(jié)為單位。
FT245R內(nèi)部有兩個(gè)FIFO分別為FIFO TX Buffer和FIFO RX Buffer,F(xiàn)IFO TX Buffer負(fù)責(zé)存放接收從PC機(jī)發(fā)送來(lái)的數(shù)據(jù),F(xiàn)IFO RX Buffer負(fù)責(zé)接收從USB-JTAG協(xié)議轉(zhuǎn)換器發(fā)送來(lái)的數(shù)據(jù),為了區(qū)分稱(chēng)之為FIFO_TX和FIFO_RX。FT245R芯片的內(nèi)部結(jié)構(gòu)如圖2所示。
圖2 FT245R芯片的內(nèi)部結(jié)構(gòu)
- SPARTAN-3E開(kāi)發(fā)板
采用xilinx的SPARTAN-3E開(kāi)發(fā)板,將目標(biāo)處理器與片上調(diào)試器的硬件邏輯還有協(xié)議轉(zhuǎn)換器中的JTAG信號(hào)的生成功能都集成到該開(kāi)發(fā)板的FPGA上。系統(tǒng)如圖3所示。
圖3
- 片上調(diào)試器結(jié)構(gòu)
圖4 片上調(diào)試器結(jié)構(gòu)
TAP控制器掌管JTAG協(xié)議的狀態(tài)機(jī),控制OCD與USB-JTAG協(xié)議轉(zhuǎn)換器之間的數(shù)據(jù)和指令的移入移出。TAP(Test Access Port)包含四個(gè)引腳用來(lái)控制指定的操作。這四個(gè)引腳分別為T(mén)MS,TCK,TDI,TDO。TAP控制器內(nèi)部采用標(biāo)準(zhǔn)的JTAG協(xié)議狀態(tài)機(jī)來(lái)控制TAP的數(shù)據(jù)通路,包括指令寄存器掃描鏈和數(shù)據(jù)寄存器掃描鏈的選擇以及掃描鏈數(shù)據(jù)的傳輸。
寄存器包括邊界掃描寄存器、BYPASS寄存器、斷點(diǎn)寄存器和指令寄存器。邊界掃描寄存器在此處是為讀取處理器輸入輸出引腳預(yù)留的擴(kuò)展寄存器;BYPASS寄存器是位寬為1的寄存器,當(dāng)在多個(gè)器件或模塊串聯(lián)的時(shí)候用該寄存器來(lái)旁路當(dāng)前器件或模塊;指令寄存器主要用來(lái)存放對(duì)CPU進(jìn)行調(diào)試的相應(yīng)調(diào)試指令。
掃描鏈包括寫(xiě)PC掃描鏈和自定義數(shù)據(jù)掃描鏈。寫(xiě)PC掃描鏈?zhǔn)菫榱藢?xiě)入PC值而設(shè)計(jì)的掃描鏈,而通過(guò)自定義數(shù)據(jù)掃描鏈可以讀出處理器內(nèi)部的狀態(tài)和數(shù)據(jù)。
處理器運(yùn)行控制模塊是片上調(diào)試器的核心部件,負(fù)責(zé)調(diào)試指令的譯碼以及讀CPU寄存器、復(fù)位、斷點(diǎn)設(shè)置檢測(cè)和處理器運(yùn)行控制,還有寫(xiě)CPU內(nèi)部程序計(jì)數(shù)器PC等調(diào)試功能的實(shí)現(xiàn)。
- 處理器運(yùn)行控制模塊
處理器運(yùn)行控制模塊是片上調(diào)試器的核心部件,負(fù)責(zé)指令譯碼和根據(jù)當(dāng)前指令和CPU的運(yùn)行狀態(tài)進(jìn)行機(jī)器指令或者微指令的單步和斷點(diǎn)的判定,并且根據(jù)判定結(jié)果控制CPU的運(yùn)行。指令譯碼就是根據(jù)PC上層平臺(tái)發(fā)送到指令寄存器中的指令來(lái)產(chǎn)生相應(yīng)的控制信號(hào),直接通過(guò)這些控制信號(hào)控制CPU的運(yùn)行、停止和復(fù)位等。設(shè)計(jì)了9條指令,分別為:
1)SREAD:CPU停止,并且此時(shí)選通CPU內(nèi)部掃描寄存器數(shù)據(jù)鏈讀出CPU內(nèi)部主要寄存器的值。
2)STEP:微指令的單步,CPU運(yùn)行一條微指令然后停下來(lái)。
3)MSTP:機(jī)器指令的單步,CPU運(yùn)行一條機(jī)器指令然后停下來(lái)。
4)BPSET:斷點(diǎn)設(shè)置,該指令只負(fù)責(zé)產(chǎn)生斷點(diǎn)設(shè)置所需要的相應(yīng)控制信號(hào),并不負(fù)責(zé)斷點(diǎn)數(shù)據(jù)的寫(xiě)入。實(shí)際的斷點(diǎn)數(shù)據(jù)是用戶(hù)通過(guò)PC機(jī)的上層工具設(shè)置以后,再進(jìn)行一個(gè)BPR的數(shù)據(jù)寫(xiě)入來(lái)完成的。
5)RUN:CPU運(yùn)行指令。
6)BRUN:斷點(diǎn)運(yùn)行,在斷點(diǎn)設(shè)置完成以后,發(fā)送該指令來(lái)使CPU運(yùn)行。
7)RESET:復(fù)位指令,使CPU復(fù)位。
8)WPC:寫(xiě)PC指令,為用戶(hù)提供對(duì)CPU內(nèi)部程序計(jì)數(shù)器PC值進(jìn)行寫(xiě)入的功能,以滿(mǎn)足某些用戶(hù)的特殊需求。
9)STOP:CPU停止指令。
上面所描述的9條指令, 其中BPSET和BPRUN指令是兩條相互依賴(lài)的調(diào)試指令,兩條指令聯(lián)合完成斷點(diǎn)調(diào)試功能。其他的指令都是一條指令完成相應(yīng)的調(diào)試功能。
- 斷點(diǎn)設(shè)置和檢測(cè)
首先要通過(guò)外部來(lái)設(shè)置斷點(diǎn)值,硬件部分要設(shè)計(jì)一個(gè)斷點(diǎn)寄存器BPR用來(lái)存放用戶(hù)設(shè)置的機(jī)器指令斷點(diǎn)或者微指令斷點(diǎn)值,該寄存器位寬為24,其中低18位為有效數(shù)據(jù)位,高6位作為預(yù)留的擴(kuò)展位。通過(guò)邊界掃描的方式將斷點(diǎn)值串行的移入到斷點(diǎn)寄存器BPR中。
BPR[17:16]兩位為標(biāo)志位用來(lái)進(jìn)行斷點(diǎn)類(lèi)型的區(qū)分,當(dāng)BPR[17:16]=00時(shí)表明要寫(xiě)入的是微指令斷點(diǎn),此時(shí)BPR[8:0]為要寫(xiě)入的微指令的斷點(diǎn)值即斷點(diǎn)微地址;當(dāng)BPR[17:16]=01時(shí)表示要寫(xiě)入的是機(jī)器指令斷點(diǎn),此時(shí)BPR[15:0]為要寫(xiě)入的機(jī)器指令的斷點(diǎn)值即內(nèi)存機(jī)器指令的地址。
斷點(diǎn)的檢測(cè)首先根據(jù)標(biāo)志位來(lái)區(qū)分?jǐn)帱c(diǎn)類(lèi)型,是微指令斷點(diǎn)還是機(jī)器指令斷點(diǎn)。當(dāng)標(biāo)志位為00時(shí),將斷點(diǎn)值與微指令地址進(jìn)行比較,其值一致時(shí)產(chǎn)生斷點(diǎn)觸發(fā)信號(hào);當(dāng)標(biāo)志位為01時(shí),將斷點(diǎn)值與PC寄存器中的機(jī)器指令地址進(jìn)行比較,如果一致同樣產(chǎn)生斷點(diǎn)觸發(fā)信號(hào)。
- PC值的寫(xiě)入
處理器調(diào)試的過(guò)程中,為了能夠隨時(shí)控制處理器所要執(zhí)行的指令,需要設(shè)置PC(程序計(jì)數(shù)器)值即所要執(zhí)行的指令的地址。采用邊界掃描技術(shù)來(lái)實(shí)現(xiàn)該功能,設(shè)計(jì)一條掃描鏈通過(guò)該掃描鏈將要設(shè)置的PC值寫(xiě)入到PC寄存器中,掃描鏈的結(jié)構(gòu)如圖5所示。
圖5 寫(xiě)PC掃描鏈
由于CISC處理器內(nèi)部的寄存器在寫(xiě)入和讀出時(shí)都有相應(yīng)的使能信號(hào),所以在寫(xiě)入PC值的時(shí)候需要使PC的使能信號(hào)PCce有效,而這些寄存器的使能信號(hào)的產(chǎn)生是由微指令譯碼得來(lái)的,如果要修改微指令會(huì)影響到其他寄存器的使能控制存在一定的風(fēng)險(xiǎn)。
為了解決這個(gè)問(wèn)題可以有兩種方法可供選擇:
1、將uIR數(shù)據(jù)讀出,PC寫(xiě)操作完成以后再寫(xiě)回
該方法是先將uIR內(nèi)部的內(nèi)容讀出保存好,然后寫(xiě)入帶有PC寄存器使能控制信號(hào)微指令,當(dāng)PC值正確寫(xiě)入以后再將原來(lái)保存的uIR的值還原到uIR寄存器中。
2、引入偽微指令寄存器用來(lái)在寫(xiě)入PC值取代uIR輸出微指令
該方法是在微指令寄存器uIR到微指令譯碼模塊uIR_Decoder之間加入一個(gè)掃描寄存器BSC_uIR,稱(chēng)之為偽微指令寄存器,這個(gè)寄存器在保證不影響uIR的前提下產(chǎn)生PCce信號(hào)。當(dāng)寫(xiě)入PC值時(shí)首先選中該掃描鏈,然后將要寫(xiě)入PC的數(shù)據(jù)移入BSC_PC_A中,PCce有效則將BSC_PC_A中數(shù)據(jù)更新到PC中,完成PC的寫(xiě)操作。
第一種方法操作起來(lái)比較繁瑣并且對(duì)軟件的設(shè)計(jì)要求也比較高,在PC機(jī)和硬件平臺(tái)指令就會(huì)存在反復(fù)傳送數(shù)據(jù)的局面增加了數(shù)據(jù)出錯(cuò)的幾率。而第二種方法實(shí)施起來(lái)比較簡(jiǎn)單,并且只要將需要的微指令和要寫(xiě)入的PC值一起進(jìn)行一次寫(xiě)操作就可以完成,還保證了uIR寄存器中原有的微指令保持不變。因此本文采用了第二種方法。
- 處理器內(nèi)部狀態(tài)讀出
處理器內(nèi)部寄存器反映處理器內(nèi)部運(yùn)行的狀態(tài)和當(dāng)前一些主要數(shù)據(jù),在調(diào)試過(guò)程中必須能夠?qū)⑦@些數(shù)據(jù)讀回給用戶(hù)。這樣就需要在處理器內(nèi)部構(gòu)建一條自定義數(shù)據(jù)掃描鏈,當(dāng)執(zhí)行處理器內(nèi)部數(shù)據(jù)讀出調(diào)試功能時(shí)先選中該掃描鏈,然后將該掃描鏈內(nèi)部數(shù)據(jù)讀回到PC機(jī)上層控制臺(tái)。處理器內(nèi)部自定義數(shù)據(jù)掃描鏈的結(jié)構(gòu)如圖6所示。
圖 6 自定義數(shù)據(jù)掃描鏈
構(gòu)建數(shù)據(jù)掃描鏈可以考慮在在寄存器的輸入或者輸出線上加邊界掃描單元的方法來(lái)捕獲數(shù)據(jù),而不直接對(duì)寄存器本身進(jìn)行操作,這樣就將片上調(diào)試器對(duì)CPU的侵入性降到最低,保證了CPU內(nèi)部數(shù)據(jù)通路的獨(dú)立性。
由于在處理器內(nèi)部寄存器的值的更新都有嚴(yán)格的時(shí)序控制,所以將掃描寄存器加在寄存器的輸入線和輸出線上是有區(qū)別的。這些寄存器輸入線上的數(shù)據(jù)要存入到寄存器中在下一個(gè)時(shí)鐘周期輸出才會(huì)生效,例如IR中指令輸出到微控制部件去譯碼才會(huì)起作用。所以為了要了解當(dāng)前正在起作用的這些寄存器的值,另外輸入線上的值隨時(shí)都可能變化,由于這兩個(gè)原因在輸入線上引入邊界掃描寄存器才可以真實(shí)的反映處理器當(dāng)前的狀態(tài)和寄存器的值。
- 系統(tǒng)軟件設(shè)計(jì)
調(diào)試系統(tǒng)不僅需要底層硬件的良好支持,還需要有一個(gè)便于用戶(hù)使用的PC機(jī)上層的控制臺(tái)。該控制臺(tái)主要功能是發(fā)送數(shù)據(jù)到串并轉(zhuǎn)換芯片F(xiàn)T245R,數(shù)據(jù)經(jīng)過(guò)FT245R轉(zhuǎn)換以后變?yōu)椴⑿械?bit數(shù)據(jù)送入到USB-JTAG協(xié)議轉(zhuǎn)換器,協(xié)議轉(zhuǎn)換器將數(shù)據(jù)進(jìn)行解析來(lái)相應(yīng)的產(chǎn)生TAP信號(hào)。
PC機(jī)通過(guò)USB電纜與FT245R相連,所以PC機(jī)只要將數(shù)據(jù)發(fā)送到FT245R任務(wù)就完成了,其他的都由下面的硬件來(lái)實(shí)現(xiàn)。采用C++builer6.0為PC機(jī)控制臺(tái)的開(kāi)發(fā)平臺(tái),添加FT245R廠商提供的動(dòng)態(tài)鏈接庫(kù),使用FT245R的廠商提供的API函數(shù)進(jìn)行編程實(shí)現(xiàn)。
- 系統(tǒng)調(diào)試和測(cè)試
- 各調(diào)試功能的驗(yàn)證
- 測(cè)試程序
當(dāng)OCD、USB-JTAG協(xié)議轉(zhuǎn)換器和PC機(jī)控制臺(tái)這三個(gè)片上調(diào)試系統(tǒng)的組成部分都設(shè)計(jì)好以后,下一步的工作就是來(lái)編寫(xiě)一段匯編程序作為目標(biāo)測(cè)試程序,因?yàn)槟繕?biāo)處理器是一款CSIC處理器,所以還必須設(shè)計(jì)好一段可用的微程序存放到處理器內(nèi)部控制存儲(chǔ)器中來(lái)完成整個(gè)處理器控制信號(hào)的產(chǎn)生。
由于處理器內(nèi)存地址0000~002F作為堆棧使用,所以?xún)?nèi)存中存放的機(jī)器指令必須從地址0030開(kāi)始存放,本文在xilinx的SPARTAN-3E開(kāi)發(fā)板上實(shí)現(xiàn)處理器以及片上調(diào)試器,所以同時(shí)也將編寫(xiě)好的測(cè)試程序生成存儲(chǔ)器初始化文件,然后采用xilinx的RAM核將編輯好的存儲(chǔ)器文件初始化到該RAM核中。在處理器上電時(shí)的程序入口地址設(shè)置為測(cè)試程序的入口即可。
現(xiàn)在編寫(xiě)一段測(cè)試程序如下:
0030:0761 0100; MOV #100H,R1
0032:043A 0002; MOV R1,0002H
0034:2b68 0001; TEST #0001H, R0
0036:019a 000B; JZ 000BH
左邊是在機(jī)器指令以及其在內(nèi)存中的位置,右邊是其對(duì)應(yīng)的匯編程序。其中共有四條指令,包括對(duì)通用寄存器、內(nèi)存等資源的訪問(wèn),跳轉(zhuǎn)指令是程序的跳躍執(zhí)行,由于在此處關(guān)注的是處理器的內(nèi)部狀態(tài),所采用的測(cè)試程序只要能夠覆蓋整個(gè)處理器的數(shù)據(jù)通路即可。
- 復(fù)位功能驗(yàn)證
復(fù)位功能是指當(dāng)系統(tǒng)出現(xiàn)異常或者處于的狀態(tài)用戶(hù)不能確定時(shí),可以使用該功能使處理器回到初始狀態(tài)。由于處理器內(nèi)部與處理器初始運(yùn)行有關(guān)的寄存器初始值都是確定的值,所以要驗(yàn)證復(fù)位調(diào)試功能,只需將復(fù)位調(diào)試指令發(fā)送到OCD,然后讀出處理器內(nèi)部寄存器的值與寄存器的初始值是否相同來(lái)確定復(fù)位調(diào)試功能是否正確執(zhí)行。
首先來(lái)看一下處理器內(nèi)部一些寄存器的初始值,在處理器內(nèi)部堆棧指針SP、程序計(jì)數(shù)器PC和中斷允許寄存器MASK有特別的初始值,其他寄存器都為0值,SP初始值為0030H,PC值也為0030H,因?yàn)樵谔幚砥鬟\(yùn)行時(shí)SP從0030H往小地址減而PC值則是往大地址執(zhí)行。而MASK初始值為5AA5,設(shè)置這樣的初始值主要是為了容易檢測(cè)數(shù)據(jù)在讀出時(shí)是否出現(xiàn)錯(cuò)位的現(xiàn)象。
執(zhí)行處理器復(fù)位調(diào)試功能,然后讀出內(nèi)部寄存器的值,看是否回到初始狀態(tài),PC機(jī)控制臺(tái)顯示出讀出的寄存器值如圖1,可以看出所有的寄存器都回到了初始狀態(tài),表示復(fù)位調(diào)試功能實(shí)現(xiàn)正確。
圖 1 復(fù)位功能驗(yàn)證
- 微指令單步
微指令單步主要是在執(zhí)行一條機(jī)器指令過(guò)程中,為了能更清楚詳細(xì)的處理器內(nèi)部具體操作涉及到具體的控制信號(hào)起作用以及某些寄存器的操作。本文的測(cè)試程序的第一條機(jī)器指0761 0100(MOV #100H,R1),是將立即數(shù)十六進(jìn)制的100移動(dòng)到通用寄存器R0中。根據(jù)第三章介紹的微程序的設(shè)計(jì)和微指令的轉(zhuǎn)移方式,寫(xiě)出該機(jī)器指令所對(duì)應(yīng)的微指令地址和微指令。
000:20080001;
001:00069002;
002:CC000003;
003:00000404;
004:00000A08;
00B:2008000F;
00F:00069C10;
014:C0080015;
015:00061016;
016:D0000006;
在單步調(diào)試過(guò)程中將數(shù)據(jù)讀回與以上的分析相比較,將指令0761 0100的單步調(diào)試過(guò)程每一個(gè)單步的數(shù)據(jù)都讀回,其中將微指令單步中的主要界面截圖如圖2、圖3、圖4和圖5。
圖2第一條微指令
圖3 第二條微指令
圖4 讀數(shù)據(jù)微指令
圖5 結(jié)果寫(xiě)入R1
通過(guò)觀察UAR、DR、IR、R1、PC和AR六個(gè)寄存器值的變化,可知系統(tǒng)正常按照預(yù)期運(yùn)行,并且單步調(diào)試功能正確實(shí)現(xiàn)。
- 微指令斷點(diǎn)
微指令斷點(diǎn)調(diào)試時(shí),首先通過(guò)斷點(diǎn)設(shè)置將微指令斷點(diǎn)值寫(xiě)入到斷點(diǎn)寄存器。其中斷點(diǎn)寄存器BPR中為顯示正是通過(guò)PC機(jī)控制臺(tái)寫(xiě)入到BPR寄存器中值,說(shuō)明斷點(diǎn)值已經(jīng)正確的寫(xiě)入。然后運(yùn)行處理器,由于當(dāng)處理器運(yùn)行停止時(shí)讀取處理器內(nèi)部寄存器狀態(tài),結(jié)果返回如圖6。其中UAR顯示現(xiàn)在處理器停止的微指令的位置,讀出的其他寄存器值也是運(yùn)行到當(dāng)前微指令斷點(diǎn)的值。
圖6 微指令斷點(diǎn)返回結(jié)果
- 連續(xù)運(yùn)行和停止
連續(xù)運(yùn)行是處理器運(yùn)行在正常情況下,此時(shí)并不需要片上調(diào)試器的干涉,至于停止運(yùn)行則是讓處理器運(yùn)行完當(dāng)前機(jī)器指令則停止。由于在內(nèi)存中存儲(chǔ)的程序很短,而處理器的運(yùn)行速度很快,所以在發(fā)送完連續(xù)運(yùn)行調(diào)試指令,可以馬上執(zhí)行停止運(yùn)行調(diào)試指令內(nèi)存中的測(cè)試指令已執(zhí)行完成了,所以在停止運(yùn)行指令之后再通過(guò)PC機(jī)控制臺(tái)來(lái)讀取處理器內(nèi)部寄存器的值就不會(huì)改變了。如7、8兩張截圖是停止運(yùn)行指令之后兩次讀取數(shù)據(jù)的結(jié)果,可以看出結(jié)果不再變化,證明停止調(diào)試指令正確實(shí)現(xiàn)。
圖7 第一次讀結(jié)果
圖8 第二次讀結(jié)果
- 總結(jié)
在嵌入式系統(tǒng)的開(kāi)發(fā)過(guò)程中,調(diào)試是不可或缺的一環(huán)。一個(gè)好的調(diào)試器可以大大的提高系統(tǒng)開(kāi)發(fā)的效率,縮短推出產(chǎn)品的時(shí)間,同時(shí)也提高了系統(tǒng)的可靠性。
本文設(shè)計(jì)了一個(gè)基于JTAG協(xié)議的片上調(diào)試器,該片上調(diào)試器實(shí)現(xiàn)了微指令和機(jī)器指令的單步、斷點(diǎn)以及讀取處理器內(nèi)部寄存器和寫(xiě)入PC、處理器復(fù)位等常用調(diào)試功能。構(gòu)建掃描鏈時(shí)采用獨(dú)立的掃描通路不對(duì)處理器本身寄存器做任何修改,這樣在保證實(shí)現(xiàn)調(diào)試功能的同時(shí)還最大程度的保護(hù)了處理器數(shù)據(jù)通路的獨(dú)立性,將對(duì)處理器的侵入性降到一個(gè)比較低的水平。
評(píng)論