JTAG基本原理與除錯

2021-09-06 07:27:33 字數 3295 閱讀 2885

jtag(joint test action group)聯合測試行動小組)是一種國際標準測試協議(ieee 1149.1相容),主要用於晶元內部測試。現在多數的高階器件都支援jtag協議,如dsp、fpga器件等。標準的jtag介面是4線:tms、 tck、tdi、tdo,分別為模式選擇、時鐘、資料輸入和資料輸出線。

上面的資訊是從度娘百科引用過來的,對於jtag沒有了解過的人來說,上面的大部分內容都不知道說什麼,當然,我是一開始看的時候也看不懂。

不過從上面得出來的資訊知道,jtag是乙個協議,標準有4個引腳,用於晶元的測試與程式設計除錯。

jtag是有硬體實現的。

在cpu(注意:這裡的cpu是指運算處理單元,只包含了內部暫存器以及運算單元等基本部件)外圍,處理器(即cpu擴充套件晶元,不是soc)內部包含了jtag的硬體實現,並且向外界提供介面,也就是上面所說的tms,tck,tdi,tdo,四個引腳。

如圖:

邊界掃瞄鏈

jtag如何用於晶元測試呢? 其中用到的最主要部件就是邊界掃瞄鏈。

命名為邊界掃瞄鏈,是由於它位置處於處理器的邊界上。

我們知道cpu是通過引腳與外圍交流的,所有的資料都會通過引腳輸入或者輸出,而jtag就是通過監控引腳的訊號達到晶元測試的目的。

而邊界掃瞄鏈就是在引腳上的乙個部件。如下圖:

通過邊界掃瞄鏈,當有訊號輸入的時候,邊界掃瞄鏈就能獲取訊號,當cpu要輸出訊號的時候,邊界掃瞄鏈也能獲取要輸出的訊號。

另外也可以通過邊界掃瞄鏈來直接向外部輸出訊號。

無論是訊號的抓取還是輸出,都需要有介面來儲存這些訊號,tdi跟tdo就是做這樣一些工作的。

如圖:

本來邊界掃瞄鏈儲存著引腳上的訊號,當通過tdi引腳輸入我們自己的訊號的時候,會發生沿上面紅線方向的移位操作,

tdi ——〉 邊界掃瞄鏈 —— 〉 tdo

就能從tdo獲取邊界掃瞄鏈上的訊號,我們從tdi輸入的訊號也會到邊界掃瞄鏈上去。

在cpu跟外界通訊的引腳上的資料無非就是 指令 跟 資料訊號(包括位址跟資料) 兩種。但是這兩者的結合形成了乙個完整的程式,能對它們進行監控就表明我們能進行程式的除錯。

上面的只是jtag最基本的原理,要對程式更好的除錯還需要控制部件,還有更多暫存器的結合等等。

下面是乙個完整的jtag除錯部件:

更詳細的jtag資訊可以看看

下面來講講arm上的jtag除錯,openocd就是乙個jtag的除錯工具

以下基於s3c2440,openocd

我們在除錯程式的時候,通常需要設定斷點,斷點也就是指令所在的位置,

斷點分為兩種:硬體斷點跟軟體斷點

硬體斷點:指令的位址。當cpu要去某個位址取指令的時候,就暫停cpu的執行。在s3c2440上只支援兩個硬體斷點

軟體斷點:軟體斷點不限制斷點的個數,因此硬體斷點的方法是不可用的。當我們需要在某個指令上打斷點的時候,openocd會先去取得斷點的位址,然後把每個斷點處的值替換成某個特定的值(如deeedeee),當cpu取資料的時候得到該特定的值,就知道到達了斷點位址,暫停cpu的執行,去除斷點的時候再把原本的值換回去。如果沒指定硬體斷點的話,一般都預設是軟體斷點。

另外openocd對於軟體斷點有特定的要求:

1.程式必須位於它的鏈結位址上,即如果指定了. = 0x30000000,那麼程式必須實際上是位於0x30000000這個地方,也就是說程式必須已經重定位好,位於它的鏈結位址。

2.程式必須按照某種特定的順序排放:

sections

.rodata align(4) :

.data align(4) :

.bss align(4) :

}

gdb除錯就是基於軟體斷點的除錯,我們可以用gdb對程式**的某一行進行斷點設定,那麼它是如何定位到某個指令的位址的?

這就需要有除錯資訊,也就是在編譯的時候加上 -g 給程式新增除錯資訊。

eclipse對gdb進行了進一步的封裝(gui),我們可以通過對eclipse進行某些設定達到除錯arm程式的目的。

1.首先把檔案加入工程

2.設定除錯配置:

點工具欄上的小蟲子

debug configurations...

新建乙個除錯配置

選擇選項卡debugger,gdb debugger: 選擇為arm-elf-gdb

選擇選項卡commands, 'initialize'conmmands 下輸入命令:

target remote 127.0.0.1:3333    //連線openocd

load                //引導程式到記憶體

break _start            //設定斷點到_start

c        //continue繼續執行

3.當然,上述程式是在記憶體執行的,但是開發板一開始的時候記憶體還沒初始化,是不可用的,因此我們需要先設定記憶體

在openocd的命令控制台上(telnet 127.0.0.1 4444進入openocd控制台)

halt    //暫停cpu

load_image  init.bin  0   //載入記憶體初始化程式 init.bin 到 0 位址

resume  0    //在0位址開始執行

halt  //暫停cpu

然後就可以debug了

debug時,當執行到斷點處的時候,我們可以看到某些暫存器或者變數的值,這些值在eclipse上顯示:

mysql的基本原理 Mysql 基本原理

mysql 基本原理 mysql是一種關聯式資料庫管理系統,關聯式資料庫將資料儲存在不同的表中,而不是將所有資料放在乙個大倉庫內,這樣就增加了速度並提高了靈活性 ysql是資料庫登入命令 uroot預設超級使用者登入 p 預設沒密碼 中寫密碼 mysqladmin uroot password 12...

8 2 1 基本原理

乙個舞台動畫物件在包含許多舞台資訊 出現在何處,佔多大面積,處在什麼角度,是否可見 這些資訊分別儲存在動畫物件的屬性中。在 中讀取這些屬性可以了解物件的位置 大小 角度等狀態資訊 修改這些屬性可以改變物件的位置 大小 角度等狀態。如果從資料的角度去理解,動畫就是在固定時間間隔點不斷修改動畫物件某項屬...

Csocket基本原理

我通過幾個採用 csocket 類編寫並基於 client server 客戶端 服務端 的網路聊天和傳輸檔案的程式 在除錯這些程式的過程中,追蹤深入至 csocket 類核心原始碼 sockcore.cpp 對於csocket 類的執行機制可謂是一覽無遺,並且對於阻塞和非阻塞方式下的 socket...