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.程式必須按照某種特定的順序排放:
sectionsgdb除錯就是基於軟體斷點的除錯,我們可以用gdb對程式**的某一行進行斷點設定,那麼它是如何定位到某個指令的位址的?.rodata align(4) :
.data align(4) :
.bss align(4) :
}
這就需要有除錯資訊,也就是在編譯的時候加上 -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...