當(dāng)前位置:首頁 > 學(xué)習(xí)資源 > 講師博文 > JTAG和SWD的調(diào)試技術(shù)及應(yīng)用
引言
在一些常見的嵌入式系統(tǒng)的開發(fā)當(dāng)中,硬件的調(diào)試接口是極其重要的,但是一些傳統(tǒng)的調(diào)試方法往往存在一些可能致命的問題。比如串口調(diào)試雖然簡(jiǎn)單容易使用,但是實(shí)時(shí)性較差,不夠精確。單步執(zhí)行的話,雖然精確度高,但是又存在操作復(fù)雜的問題。傳統(tǒng)的調(diào)試方法往往受到速度、準(zhǔn)確性和調(diào)試精度的限制。
為了解決這些問題,JTAG(聯(lián)合測(cè)試行動(dòng)組,Joint Test Action Group)和SWD(Serial Wire Debug)作為兩種主要的調(diào)試協(xié)議,廣泛應(yīng)用于嵌入式開發(fā)中。它們提供了高效的硬件調(diào)試手段,不僅能夠?qū)崿F(xiàn)單步執(zhí)行、斷點(diǎn)設(shè)置、變量監(jiān)控等常規(guī)調(diào)試功能,還能夠深入底層硬件,進(jìn)行更復(fù)雜的系統(tǒng)級(jí)調(diào)試。
JTAG 和 SWD
JTAG(聯(lián)合測(cè)試行動(dòng)組)
大多說人可能聽過JTAG,并且用它給MCU或者FPGA燒錄過程序,或者對(duì)開發(fā)板進(jìn)行過調(diào)試,JTAG 最初是為了解決硬件板級(jí)測(cè)試問題而提出的,它是一種標(biāo)準(zhǔn)化的調(diào)試接口,那什么是標(biāo)準(zhǔn)化的調(diào)試接口呢?比如說在PCB板上存在三種廠家的芯片,那如果想對(duì)三個(gè)芯片都進(jìn)行測(cè)試的話就需要一個(gè)適應(yīng)所有芯片的代碼,會(huì)非常的龐大且單一性較強(qiáng),所以才有了像JTAG這些標(biāo)準(zhǔn)化的調(diào)試接口。
JTAG 協(xié)議基于一個(gè)串行通信接口,由四個(gè)主要的信號(hào)線(上圖中的實(shí)線部分)和一個(gè)復(fù)位引腳組成(虛線部分)主要通過四個(gè)信號(hào)引腳進(jìn)行數(shù)據(jù)傳輸:
· TDI(Test Data In):測(cè)試數(shù)據(jù)輸入,用于接收數(shù)據(jù)到目標(biāo)設(shè)備。
· TDO(Test Data Out):測(cè)試數(shù)據(jù)輸出,用于輸出從目標(biāo)設(shè)備獲取的數(shù)據(jù)。
· TMS(Test Mode Select):測(cè)試模式選擇,通過該信號(hào)來選擇不同的工作模式。
· TCK(Test Clock):測(cè)試時(shí)鐘,提供時(shí)鐘信號(hào)以驅(qū)動(dòng)數(shù)據(jù)傳輸。
通過這四個(gè)信號(hào),JTAG 能夠控制和訪問目標(biāo)設(shè)備的各個(gè)寄存器、內(nèi)存以及執(zhí)行控制流程。
我們?cè)谑褂肑TAG進(jìn)行調(diào)試時(shí),一般不會(huì)在我們寫好的代碼當(dāng)中去調(diào)用JTAG的接口,而是通過JTAG調(diào)試器來與硬件進(jìn)行交互。一般會(huì)與我們的開發(fā)環(huán)境進(jìn)行配合,比如我們常見的GDB調(diào)試工具。下面我舉了一個(gè)簡(jiǎn)單的例子來使用JTAG進(jìn)行調(diào)試。
下面我將對(duì)上面的C語言程序使用GDB和JTAG進(jìn)行調(diào)試
1. 編譯程序,為了使用 GDB 和 JTAG 進(jìn)行調(diào)試,我們需要編譯程序并生成調(diào)試信息。使用 -g 參數(shù)編譯程序,這樣 GDB 才能讀取符號(hào)信息
2. 假設(shè)已經(jīng)連接了一個(gè) JTAG 調(diào)試器(如 ST-Link 或 J-Link),可以使用 OpenOCD 啟動(dòng)調(diào)試服務(wù)器。這個(gè)服務(wù)器會(huì)通過 JTAG 接口與目標(biāo)硬件通信。在 OpenOCD 啟動(dòng)命令行中指定調(diào)試器接口和目標(biāo)設(shè)備
執(zhí)行結(jié)束后會(huì)啟動(dòng)OpenOCD,對(duì)GDB調(diào)試命令進(jìn)行監(jiān)聽。
3. 啟動(dòng)GDB并且加載好編譯的文件
4. 連接GDB到OpenOCD在 GDB 中,連接到運(yùn)行 OpenOCD 的調(diào)試服務(wù)器
GDB 會(huì)連接到 OpenOCD,后者通過 JTAG 連接到目標(biāo)設(shè)備。
1. 設(shè)置斷點(diǎn)并且調(diào)試
l 設(shè)置斷點(diǎn):可以設(shè)置斷點(diǎn)在 main 函數(shù)或任何其他地方(例如,剛剛插入的 __asm("bkpt #0"))。
l break main:會(huì)在main函數(shù)的開頭設(shè)置一個(gè)斷點(diǎn)
l 運(yùn)行程序:使用 continue 命令運(yùn)行程序,GDB 會(huì)在斷點(diǎn)處暫停。
l 單步執(zhí)行:當(dāng)程序在斷點(diǎn)處暫停時(shí),可以單步執(zhí)行代碼:(step 進(jìn)入函數(shù) next 執(zhí)行下一行,不進(jìn)入函數(shù))
l 查看寄存器:可以查看 CPU 寄存器的內(nèi)容,例如查看程序計(jì)數(shù)器 PC(info registers)
l 查看變量值:還可以查看某個(gè)變量的值,例如查看 i(print i)
l 退出 GDB:調(diào)試結(jié)束后,你可以退出 GDB。
2. 調(diào)試器和JTAG的交互
l 當(dāng)程序運(yùn)行到 __asm("bkpt #0") 斷點(diǎn)時(shí),JTAG 調(diào)試器會(huì)暫停程序的執(zhí)行,GDB 會(huì)接管控制。
l 你可以通過 GDB 調(diào)試命令來執(zhí)行單步調(diào)試、查看寄存器和內(nèi)存內(nèi)容、設(shè)置更多斷點(diǎn)等。
l TAG 在這個(gè)過程中負(fù)責(zé)與硬件進(jìn)行交互,GDB 通過 JTAG 通道控制程序執(zhí)行。
以上就是JATG的基本使用方法。那下面我們?cè)賮碚f一下SWD
SWD(Serial Wire Debug)調(diào)試技術(shù)
SWD是我們?cè)趯W(xué)習(xí)STM32過程中最常見的燒錄接口SWD是由ARM公司為其處理器(特別是Cortex系列)開發(fā)的一種串行調(diào)試接口。它的設(shè)計(jì)目的是為了在有限的引腳資源下提供高效、低功耗的調(diào)試解決方案,尤其適用于嵌入式應(yīng)用和資源受限的系統(tǒng)。
SWD是一個(gè)2線(或4線)接口,相比JTAG節(jié)省了許多硬件資源,典型的接口信號(hào)有:
l SWDIO(Serial Wire Debug Input/Output):串行數(shù)據(jù)輸入/輸出
l SWCLK(Serial Wire Clock):時(shí)鐘信號(hào)
l NRST(可選,復(fù)位信號(hào)):目標(biāo)設(shè)備的復(fù)位信號(hào)
SWD提供了與JTAG類似的調(diào)試功能,但采用串行方式進(jìn)行數(shù)據(jù)傳輸,相對(duì)占用更少的引腳。
如果想進(jìn)行SWD的實(shí)際調(diào)試,只需要將上面示例中的JTAG更換成SWD即可
JTAG和SWD在系統(tǒng)調(diào)試中的應(yīng)用
以上示例就是JTAG和SWD的簡(jiǎn)單使用,那在實(shí)際的應(yīng)用開發(fā)當(dāng)中,這兩種調(diào)試方法我們應(yīng)該如何去選擇呢?這就需要了解一下兩種技術(shù)的優(yōu)缺點(diǎn)
首先,JTAG技術(shù)具有廣泛的硬件支持,很多嵌入式的芯片和處理器都提供了JTAG接口,JATG接口通常提供了豐富的調(diào)試功能,包括讀取和寫入寄存器、訪問內(nèi)存、硬件斷點(diǎn)等。因?yàn)镴TAG提供了更多的控制和功能,所以更適用于比較復(fù)雜的嵌入式操作系統(tǒng)。但是由于它的并行性和較多的控制線,硬件實(shí)現(xiàn)會(huì)更加復(fù)雜。
SWD的硬件設(shè)計(jì)更為簡(jiǎn)化,只需要少量的引腳,所以在資源受限的系統(tǒng)中更加容易執(zhí)行,但是提供的功能不如JTAG豐富。
那JTAG vs. SWD:如何選擇?
在選擇JTAG還是SWD時(shí),應(yīng)考慮以下因素:
1、硬件支持
首先,檢查目標(biāo)芯片是否支持所需的調(diào)試接口。如果芯片只支持其中一種接口,選擇已支持的接口是明智的。
2、性能需求
如果你需要更高的通信速度和較低的功耗,那么SWD可能是更好的選擇。但如果你需要豐富的調(diào)試功能,可能需要使用JTAG。
3、系統(tǒng)復(fù)雜性
對(duì)于較復(fù)雜的系統(tǒng),特別是涉及多個(gè)處理器核心或FPGA的系統(tǒng),JTAG通常更適用,因?yàn)樗峁┝烁嗟目刂坪凸δ堋?/p>
4、成本考慮
考慮硬件成本和復(fù)雜性。SWD通常更簡(jiǎn)單,因此在資源有限的系統(tǒng)中可能更經(jīng)濟(jì)實(shí)惠。
5、開發(fā)工具
確保你的開發(fā)工具和調(diào)試器支持你選擇的接口。大多數(shù)現(xiàn)代調(diào)試工具都同時(shí)支持JTAG和SWD。
結(jié)論
JTAG和SWD都是重要的嵌入式系統(tǒng)調(diào)試接口,各自具有優(yōu)勢(shì)和劣勢(shì)。選擇哪種接口取決于項(xiàng)目需求、硬件支持和性能要求。對(duì)于復(fù)雜的系統(tǒng),可能需要使用JTAG以獲得更多的控制和功能,而對(duì)于資源有限的系統(tǒng),SWD可能更適合。綜合考慮這些因素,可以幫助你做出明智的選擇,以便更有效地進(jìn)行嵌入式系統(tǒng)開發(fā)和調(diào)試。