jtag相关
http://www.cnblogs.com/TaigaCon/archive/2012/12/20/2826941.html
JTAG(Joint Test Action Group)聯(lián)合測(cè)試行動(dòng)小組)是一種國(guó)際標(biāo)準(zhǔn)測(cè)試協(xié)議(IEEE 1149.1兼容),主要用于芯片內(nèi)部測(cè)試。現(xiàn)在多數(shù)的高級(jí)器件都支持JTAG協(xié)議,如DSP、FPGA器件等。標(biāo)準(zhǔn)的JTAG接口是4線:TMS、 TCK、TDI、TDO,分別為模式選擇、時(shí)鐘、數(shù)據(jù)輸入和數(shù)據(jù)輸出線。
? JTAG最初是用來(lái)對(duì)芯片進(jìn)行測(cè)試的,基本原理是在器件內(nèi)部定義一個(gè)TAP(Test Access Port 測(cè)試訪問(wèn)口)通過(guò)專用的JTAG測(cè)試工具對(duì)進(jìn)行內(nèi)部節(jié)點(diǎn)進(jìn)行測(cè)試。JTAG測(cè)試允許多個(gè)器件通過(guò)JTAG接口串聯(lián)在一起,形成一個(gè)JTAG鏈,能實(shí)現(xiàn)對(duì)各個(gè)器件分別測(cè)試。現(xiàn)在,JTAG接口還 常用于實(shí)現(xiàn)ISP (In-System Programmable 在線編程),對(duì)FLASH等器件進(jìn)行編程。 ?JTAG編程方式是在線編程,傳統(tǒng)生產(chǎn)流程中先對(duì)芯片進(jìn)行預(yù)編程實(shí)現(xiàn)再裝到板上因此而改變,簡(jiǎn)化的流程為先固定器件到電路板上,再用JTAG編程,從而大大加快工程進(jìn)度。JTAG接口可對(duì)PSD芯片內(nèi)部的所有部件進(jìn)行編程。
上面的信息是從度娘百科引用過(guò)來(lái)的,對(duì)于jtag沒(méi)有了解過(guò)的人來(lái)說(shuō),上面的大部分內(nèi)容都不知道說(shuō)什么,當(dāng)然,我是一開(kāi)始看的時(shí)候也看不懂。
不過(guò)從上面得出來(lái)的信息知道,jtag是一個(gè)協(xié)議,標(biāo)準(zhǔn)有4個(gè)引腳,用于芯片的測(cè)試與編程調(diào)試。
?
jtag是有硬件實(shí)現(xiàn)的。
在cpu(注意:這里的cpu是指運(yùn)算處理單元,只包含了內(nèi)部寄存器以及運(yùn)算單元等基本部件)外圍,處理器(即cpu擴(kuò)展芯片,不是soc)內(nèi)部包含了jtag的硬件實(shí)現(xiàn),并且向外界提供接口,也就是上面所說(shuō)的TMS,TCK,TDI,TDO,四個(gè)引腳。
如圖:
?
邊界掃描鏈
jtag如何用于芯片測(cè)試呢? 其中用到的最主要部件就是邊界掃描鏈。
命名為邊界掃描鏈,是由于它位置處于處理器的邊界上。
我們知道cpu是通過(guò)引腳與外圍交流的,所有的數(shù)據(jù)都會(huì)通過(guò)引腳輸入或者輸出,而jtag就是通過(guò)監(jiān)控引腳的信號(hào)達(dá)到芯片測(cè)試的目的。
而邊界掃描鏈就是在引腳上的一個(gè)部件。如下圖:
?
通過(guò)邊界掃描鏈,當(dāng)有信號(hào)輸入的時(shí)候,邊界掃描鏈就能獲取信號(hào),當(dāng)cpu要輸出信號(hào)的時(shí)候,邊界掃描鏈也能獲取要輸出的信號(hào)。
另外也可以通過(guò)邊界掃描鏈來(lái)直接向外部輸出信號(hào)。
無(wú)論是信號(hào)的抓取還是輸出,都需要有接口來(lái)保存這些信號(hào),TDI跟TDO就是做這樣一些工作的。
如圖:
本來(lái)邊界掃描鏈保存著引腳上的信號(hào),當(dāng)通過(guò)TDI引腳輸入我們自己的信號(hào)的時(shí)候,會(huì)發(fā)生沿上面紅線方向的移位操作,
TDI ——〉 邊界掃描鏈 —— 〉 TDO
就能從TDO獲取邊界掃描鏈上的信號(hào),我們從TDI輸入的信號(hào)也會(huì)到邊界掃描鏈上去。
在cpu跟外界通信的引腳上的數(shù)據(jù)無(wú)非就是 指令 跟 數(shù)據(jù)信號(hào)(包括地址跟數(shù)據(jù)) 兩種。但是這兩者的結(jié)合形成了一個(gè)完整的程序,能對(duì)它們進(jìn)行監(jiān)控就表明我們能進(jìn)行程序的調(diào)試。
?
上面的只是jtag最基本的原理,要對(duì)程序更好的調(diào)試還需要控制部件,還有更多寄存器的結(jié)合等等。
下面是一個(gè)完整的jtag調(diào)試部件:
更詳細(xì)的jtag信息可以看看http://www.micetek.com.cn/technic/jtag.pdf
?
?
下面來(lái)講講arm上的jtag調(diào)試,openocd就是一個(gè)jtag的調(diào)試工具
以下基于s3c2440,openocd
?
我們?cè)谡{(diào)試程序的時(shí)候,通常需要設(shè)置斷點(diǎn),斷點(diǎn)也就是指令所在的位置,
斷點(diǎn)分為兩種:硬件斷點(diǎn)跟軟件斷點(diǎn)
硬件斷點(diǎn):指令的地址。當(dāng)cpu要去某個(gè)地址取指令的時(shí)候,就暫停cpu的運(yùn)行。在s3c2440上只支持兩個(gè)硬件斷點(diǎn)
軟件斷點(diǎn):軟件斷點(diǎn)不限制斷點(diǎn)的個(gè)數(shù),因此硬件斷點(diǎn)的方法是不可用的。當(dāng)我們需要在某個(gè)指令上打斷點(diǎn)的時(shí)候,openocd會(huì)先去取得斷點(diǎn)的地址,然后把每個(gè)斷點(diǎn)處的值替換成某個(gè)特定的值(如deeedeee),當(dāng)cpu取數(shù)據(jù)的時(shí)候得到該特定的值,就知道到達(dá)了斷點(diǎn)地址,暫停cpu的運(yùn)行,去除斷點(diǎn)的時(shí)候再把原本的值換回去。如果沒(méi)指定硬件斷點(diǎn)的話,一般都默認(rèn)是軟件斷點(diǎn)。
?
另外openocd對(duì)于軟件斷點(diǎn)有特定的要求:
1.程序必須位于它的鏈接地址上,即如果指定了. = 0x30000000,那么程序必須實(shí)際上是位于0x30000000這個(gè)地方,也就是說(shuō)程序必須已經(jīng)重定位好,位于它的鏈接地址。
2.程序必須按照某種特定的順序排放:
SECTIONS{. = 0x30000000; .text :{ head.o(.text) init.o(.text) nand.o *(.text) } .rodata ALIGN(4) : {*(.rodata)} .data ALIGN(4) : {*(.data)} .bss ALIGN(4) : {*(.bss) *(COMMON)} }?
gdb調(diào)試就是基于軟件斷點(diǎn)的調(diào)試,我們可以用gdb對(duì)程序代碼的某一行進(jìn)行斷點(diǎn)設(shè)置,那么它是如何定位到某個(gè)指令的地址的?
這就需要有調(diào)試信息,也就是在編譯的時(shí)候加上 -g 給程序添加調(diào)試信息。
?
eclipse對(duì)gdb進(jìn)行了進(jìn)一步的封裝(GUI),我們可以通過(guò)對(duì)eclipse進(jìn)行某些設(shè)置達(dá)到調(diào)試arm程序的目的。
1.首先把文件加入工程
2.設(shè)置調(diào)試配置:
點(diǎn)工具欄上的小蟲(chóng)子
Debug Configurations...
新建一個(gè)調(diào)試配置
選擇選項(xiàng)卡Main,在C/C++ Application: 選項(xiàng)上選擇要調(diào)試的elf文件
選擇選項(xiàng)卡Debugger,GDB debugger: 選擇為arm-elf-gdb
選擇選項(xiàng)卡Commands, 'Initialize'conmmands 下輸入命令:
?
target remote 127.0.0.1:3333 //連接openocd
load //加載程序到內(nèi)存
break _start //設(shè)置斷點(diǎn)到_start
c //continue繼續(xù)執(zhí)行
?
然后Apply ,最后Debug開(kāi)始調(diào)試
3.當(dāng)然,上述程序是在內(nèi)存執(zhí)行的,但是開(kāi)發(fā)板一開(kāi)始的時(shí)候內(nèi)存還沒(méi)初始化,是不可用的,因此我們需要先設(shè)置內(nèi)存
在openocd的命令控制臺(tái)上(telnet 127.0.0.1 4444進(jìn)入openocd控制臺(tái))
?
halt //暫停cpu
load_image init.bin 0? //加載內(nèi)存初始化程序 init.bin 到 0 地址
resume 0 //在0地址開(kāi)始運(yùn)行
halt //暫停cpu
?
?
然后就可以Debug了
?
Debug時(shí),當(dāng)運(yùn)行到斷點(diǎn)處的時(shí)候,我們可以看到某些寄存器或者變量的值,這些值在eclipse上顯示:
?
點(diǎn)擊打開(kāi)鏈接
總結(jié)
- 上一篇: python用pip安装numpy(如何
- 下一篇: 单片机运行相关