1、日常聊一聊
jlink調(diào)試器需要講得東西真的非常多,可能大部分的小伙伴在日常的開發(fā)中只是用它來輔助我們的目標(biāo)芯片的開發(fā),基本上是把手中的調(diào)試器當(dāng)做一個(gè)"黑匣子",不過在使用過程中也會(huì)遇到一些與我們思路相悖的現(xiàn)象,所以作者這里用一篇文章帶大家了解一下調(diào)試器的一般處理過程以便在了解調(diào)試器的原理上來解釋相關(guān)現(xiàn)象。
2、JTAG接口
我們平時(shí)使用的jlink調(diào)試器就是使用JTAG接口,JTAG以前是用于測(cè)試芯片的一種通信方式,現(xiàn)在部分ARM或者DSP等都存在JTAG接口,這樣我們就可以通過JTAG接口訪問CPU以及其內(nèi)部狀態(tài)信息等,JTAG接口其通信信號(hào)為JTAG信號(hào),JTAG信號(hào)在IEEE相關(guān)標(biāo)準(zhǔn)中必須要有TCK、TMS、TDI,TDO四個(gè)信號(hào),TRST和STCK不做強(qiáng)制要求。說實(shí)在的這幾個(gè)信號(hào)非常類似于SPI信號(hào),而且其JTAG數(shù)據(jù)傳輸也是通過數(shù)據(jù)移位的方式。
如上圖所示芯片的的JTAG接口為了提高訪問效率設(shè)計(jì)了轉(zhuǎn)移狀態(tài)機(jī),這樣就能快速訪問到芯片內(nèi)部相應(yīng)的寄存器,完成調(diào)試數(shù)據(jù)的傳輸,從而我們的KEIL或者IAR就能通過界面上看到相應(yīng)狀態(tài)寄存器及數(shù)據(jù)等。
3、邊界掃描鏈
我們1)小節(jié)說的狀態(tài)機(jī)需要與芯片內(nèi)部交互,那么實(shí)際上是通過邊界掃描鏈進(jìn)行物理上的串行移位的方式輸入或者輸出相應(yīng)的內(nèi)部狀態(tài)信息。如下圖所示處理器的周圍紅色區(qū)域即為邊界掃描鏈,邊界掃描鏈?zhǔn)怯梢粋€(gè)個(gè)移位寄存器連接而成,并且一般芯片中存在多條,不同的掃描鏈對(duì)應(yīng)著不同的功能,比如說一些掃描鏈用于訪問內(nèi)存或者處理器中的數(shù)據(jù),有些掃描鏈用于設(shè)置或者訪問內(nèi)部debug模塊等。
由于我們掃描鏈只能訪問CPU外圍的相關(guān)狀態(tài)信息,對(duì)于CPU內(nèi)部信息需要用另外一種方式,通過JTAG接口傳輸相關(guān)命令讓CPU執(zhí)行相關(guān)命令把內(nèi)部寄存器的數(shù)據(jù)轉(zhuǎn)移到TAP可以直接訪問的位置,然后傳遞出來,同時(shí)也可以通過相關(guān)指令把相應(yīng)數(shù)據(jù)寫入到CPU寄存器中。我們平時(shí)在IDE中調(diào)試界面看到的全局變量的數(shù)據(jù),就是通過在TAP可以訪問的位置放置內(nèi)存的地址,然后讓CPU執(zhí)行相關(guān)命令讀取地址訪問內(nèi)存并把數(shù)據(jù)放到TAP可以訪問的位置后傳輸出來直到IDE中顯示。
4、調(diào)試器進(jìn)行程序調(diào)試過程
我們的程序一般分為在RAM和FLASH上調(diào)試運(yùn)行,然后調(diào)試器的下載程序過程是不同的,我們都知道對(duì)于內(nèi)部RAM我們的CPU是可以直接訪問的,其RAM直接連接在數(shù)據(jù)總線、地址總線和控制總線上,并且其接口都是標(biāo)準(zhǔn)化的,那么如果我們把程序放在RAM上運(yùn)行通過JTAG直接下載程序到RAM運(yùn)行,然后復(fù)位CPU進(jìn)行調(diào)試運(yùn)行即可,可是由于芯片中的FLASH型號(hào)等差異較大,并且對(duì)于FLASH的讀、寫擦除都需要特殊的命令,不同型號(hào)存在著較大的差異,所以如果進(jìn)行FLASH上運(yùn)行調(diào)試程序還不能像RAM上運(yùn)行一樣處理。
那么目前的KEIL,IAR等等IDE工具是如何下載并在FLASH中調(diào)試程序的呢?我們熟悉KEIL、IAR進(jìn)行開發(fā)的小伙伴應(yīng)該知道,我們?cè)谶M(jìn)行JLink調(diào)試的時(shí)候會(huì)有一個(gè)選擇FLASH類型的對(duì)話框,(如下圖所示)。
那么我們可以大致猜想一下,由于FLASH的驅(qū)動(dòng)不一樣,我們進(jìn)行把對(duì)應(yīng)的FLASH驅(qū)動(dòng)下載到芯片中,然后根據(jù)下載的驅(qū)動(dòng)對(duì)FLASH進(jìn)行操作把我們的程序燒錄進(jìn)入即可進(jìn)行調(diào)試了,這里我們一般都會(huì)把該驅(qū)動(dòng)程序叫做FlashLoader,我們平時(shí)比較熟悉的是BootLoader,其實(shí)兩種其實(shí)原理都是差不多,其中下載部分都是接受程序數(shù)據(jù),然后寫入到對(duì)應(yīng)的FLASH中,只是兩者在通訊方式和作用有所區(qū)別罷了,那么我繪制一個(gè)大體的過程給大家參考學(xué)習(xí):
通過上面的圖我們應(yīng)該清楚的了解到了通過jlink一般如何把固件燒錄到FLASH上進(jìn)行仿真運(yùn)行的了,然而這個(gè)思路我們也可以用在我們的實(shí)際開發(fā)過程中比如不同芯片的升級(jí)軟件開發(fā)等,來為我們所用。
5、最后小節(jié)一下
上面的知識(shí)限于篇幅沒有講得太深,很東西可能在我們的開發(fā)過程也用不到,大致了解一下其過程即可,如果以后討論相關(guān)問題可以再另外尋找相關(guān)資料進(jìn)行閱讀理解。其實(shí)說白了JTAG就是一種通信協(xié)議,根據(jù)該通信協(xié)議發(fā)送相關(guān)命令等通過芯片內(nèi)部處理便可訪問芯片內(nèi)部狀態(tài)或者修改相應(yīng)數(shù)據(jù)等,如果我們程序全速運(yùn)行的話其調(diào)試模式和脫機(jī)模式基本上是一樣的性能,不過遇到了斷點(diǎn)就需要分情況討論相關(guān)問題了,對(duì)于需要連貫操作的通信及相關(guān)任務(wù)處理等會(huì)造成實(shí)效或者錯(cuò)亂,比如串口通信當(dāng)正在接受過程中被斷點(diǎn)打斷可能就會(huì)丟失本幀數(shù)據(jù)等,大家要注意下。
審核編輯:黃飛
-
cpu
+關(guān)注
關(guān)注
68文章
10854瀏覽量
211578 -
JTAG
+關(guān)注
關(guān)注
6文章
399瀏覽量
71673 -
調(diào)試器
+關(guān)注
關(guān)注
1文章
303瀏覽量
23716 -
Jlink
+關(guān)注
關(guān)注
6文章
111瀏覽量
37681 -
測(cè)試芯片
+關(guān)注
關(guān)注
0文章
22瀏覽量
8630
原文標(biāo)題:jlink調(diào)試器中你不知道的"那些事"(ARM篇)
文章出處:【微信號(hào):pzh_mcu,微信公眾號(hào):痞子衡嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論