基于EmJTAG的ARM嵌入式系統(tǒng)調(diào)試工具
DTC功能框圖如圖3所示。DTC是ST72651內(nèi)部集成的數(shù)據(jù)傳輸協(xié)處理器,也是一個(gè)通用的串行/并行通信接口。通過改變其內(nèi)運(yùn)行的插件程序,DTC可以方便地完成不同的高速數(shù)據(jù)傳輸操作。插件程序(最大為256字節(jié))開始時(shí)存放在ST72651的Flash中,芯片運(yùn)行的程序會(huì)將插件程序加載到DTC SW RAM中,然后控制DTC運(yùn)行這段插件程序。ST7核也可以讀寫DTC的數(shù)據(jù)傳輸緩沖區(qū),因此需要有一個(gè)仲裁電路用于防止ST7核和DTC訪問該緩沖區(qū)時(shí)發(fā)生沖突。DTC有一套簡(jiǎn)單的指令集。ST7核通過DTC控制寄存器DTCCR控制DTC的操作,通過DTC狀態(tài)寄存器DTCSR查詢DTC的狀態(tài),通過DTC指針寄存器DTCPR改變DTC的操作指針。
DTC有4種操作狀態(tài):空閑狀態(tài)(IDLE),加載插件程序狀態(tài)(RAMLOAD),運(yùn)行狀態(tài)(RUNNING)和改變操作指針狀態(tài)(POINTERCHANGE)。通過改變DTCCR寄存器的RUN、INIT和LOAD位可以實(shí)現(xiàn)4種狀態(tài)間的轉(zhuǎn)換。
將插件程序加載到DTC SW RAM中的步驟如下:
◆ 清除DTCCR寄存器的RUN位,使DTC進(jìn)入IDLE狀態(tài),停止DTC;
◆ 設(shè)置DTCCR寄存器的LOAD位,使DTC進(jìn)入RAMLOAD狀態(tài),以允許寫DTC RAM;
◆ 將插件程序復(fù)制到DTC SW RAM中;
◆ 清除DTCCR寄存器的LOAD位,使DTC返回到IDLE狀態(tài),恢復(fù)DTC RAM寫保護(hù)。
使DTC運(yùn)行其RAM(即DTC SW RAM)中的插件程序的步驟如下:
◆ 清除DTCCR寄存器的RUN位,使DTC進(jìn)入IDLE狀態(tài),停止DTC;
◆ 將插件程序的起始地址填入DTCPR寄存器中;
◆ 設(shè)置DTCCR寄存器的INIT位,使DTC進(jìn)入POINTERCHANGE狀態(tài),將DTCPR寄存器中的值復(fù)制到DTC中;
◆ 清除DTCCR寄存器的INIT位,使DTC返回到IDLE狀態(tài);
◆ 設(shè)置DTCCR寄存器的RUN位,使DTC進(jìn)入RUNNING狀態(tài),開始運(yùn)行。
DTC運(yùn)行的插件程序?qū)崿F(xiàn)的功能是:將數(shù)據(jù)傳輸緩沖區(qū)內(nèi)的數(shù)據(jù)快速移出I/O口,或者從I/O快速移入數(shù)據(jù)到數(shù)據(jù)傳輸緩沖區(qū)中。DTC操作的I/O口作為4個(gè)JTAG信號(hào): TCK、TMS、TDI和TDO。TCK作為移入/移出數(shù)據(jù)的觸發(fā)時(shí)鐘;TDI作為移出數(shù)據(jù)出口;TDO作為移入數(shù)據(jù)進(jìn)口;TMS作為輸入信號(hào),與TCK一起決定TAP控制器狀態(tài)的轉(zhuǎn)移過程。插件程序用DTC匯編指令編寫,然后通過ST公司提供的一個(gè)簡(jiǎn)單匯編器將匯編源代碼轉(zhuǎn)化成DTC機(jī)器指令,燒寫到ST72651的Flash存儲(chǔ)器中。
3.3.2 掃描鏈操作模塊
掃描鏈操作模塊調(diào)用DTC軟件插件程序,完成初始化TAP控制器、掃描鏈1操作和掃描鏈2操作。
(1) 初始化TAP控制器
TAP控制器的基本功能是產(chǎn)生時(shí)鐘信號(hào)和控制信號(hào)。它包括一個(gè)帶有16個(gè)狀態(tài)的有限狀態(tài)機(jī): Test-Logic-Reset狀態(tài)、Run-Test/Idle狀態(tài)、Select-DR-Scan狀態(tài)、Select-IR-Scan狀態(tài)、Capture-DR狀態(tài)、Shift-DR狀態(tài)、Exit1-DR狀態(tài)、Pause-DR狀態(tài)、Exit2-DR狀態(tài)、Update-DR狀態(tài)、Capture-IR狀態(tài)、Shift-IR狀態(tài)、Exit1-IR狀態(tài)、Pause-IR狀態(tài)、Exit2-IR狀態(tài)和Update-IR狀態(tài)。
初始化TAP控制器的目的是使TAP控制器進(jìn)入Select-DR-Scan狀態(tài)。無(wú)論當(dāng)前TAP控制器處于什么狀態(tài),只要在TMS為1時(shí)產(chǎn)生5個(gè)TCK信號(hào),TAP控制器就進(jìn)入Test-Logic-Reset狀態(tài)。因此,使TAP控制器進(jìn)入Select-DR-Scan狀態(tài)的步驟為:首先使TMS為1,產(chǎn)生5個(gè)TCK信號(hào),使TAP控制器進(jìn)入Test-Logic-Reset狀態(tài);然后使TMS為0,產(chǎn)生1個(gè)TCK信號(hào),使TAP控制器進(jìn)入Run-Test/Idle狀態(tài);最后使TMS為1,產(chǎn)生1個(gè)TCK信號(hào),使TAP控制器進(jìn)入Select-DR-Scan狀態(tài)。
(2) 掃描鏈1操作
掃描鏈1是JTAG電路中的一種測(cè)試數(shù)據(jù)寄存器,主要用于內(nèi)核測(cè)試和調(diào)試過程。
掃描鏈1有33位,按掃描先后順序依次為: BREAKPT位(輸入),D31~D0(輸入/輸出)。掃描鏈1操作的目的是移入BREAKPT位,同時(shí)向/從數(shù)據(jù)總線移入/移出 32位數(shù)據(jù)。操作步驟如下:
◆ 初始化TAP控制器,使TAP控制器進(jìn)入Select-D-RScan狀態(tài);
◆ 使TMS為1,產(chǎn)生1個(gè)TCK信號(hào),使TAP控制器進(jìn)入Select-IR-Scan狀態(tài);
◆ 使TMS為0,產(chǎn)生2個(gè)TCK信號(hào),使TAP控制器進(jìn)入Shift-IR狀態(tài);
◆ 往TAP控制器的指令寄存器移入JTAG指令SCAN_N(b0010);
◆ 使TAP控制器退出Shift-IR狀態(tài),進(jìn)入ShiftDR狀態(tài);
◆ 往掃描鏈選擇寄存器移入b0001,選擇掃描鏈1;
◆ 使TAP控制器退出Shift-DR狀態(tài),進(jìn)入Shift-IR狀態(tài);
◆ 往TAP控制器的指令寄存器移入JTAG指令I(lǐng)NTEST(b1100);
◆ 使TAP控制器退出Shift-IR狀態(tài),進(jìn)入Shift-DR狀態(tài);
◆ 移入BREAKPT位,移入數(shù)據(jù)D31~D0(或移出數(shù)據(jù)D31~D0);
◆ 使TAP控制器退出Shift-DR狀態(tài),進(jìn)入Select-DR-Scan狀態(tài)。
(3) 掃描鏈2操作
掃描鏈2也是一種測(cè)試數(shù)據(jù)寄存器,用于訪問EmbeddedICE宏單元的寄存器。
掃描鏈2有38位,按掃描先后順序依次為:EmbeddedICE寄存器的D0~D31,EmbeddedICE寄存器的A0~A4,讀/寫位。掃描鏈2操作的目的是讀寫EmbeddedICE宏單元的寄存器。操作步驟如下:
◆ 初始化TAP控制器,使TAP控制器進(jìn)入Select-DR-Scan狀態(tài);
◆ 使TMS為1,產(chǎn)生1個(gè)TCK信號(hào),使TAP控制器進(jìn)入Select-IR-Scan狀態(tài);
◆ 使TMS為0,產(chǎn)生2個(gè)TCK信號(hào),使TAP控制器進(jìn)入Shift-IR狀態(tài);
◆ 往TAP控制器的指令寄存器移入JTAG指令SCAN_N(b0010);
◆ 使TAP控制器退出Shift-IR狀態(tài),進(jìn)入Shift-DR狀態(tài);
◆ 往掃描鏈選擇寄存器移入b0010,選擇掃描鏈2;
◆ 使TAP控制器退出Shift-DR狀態(tài),進(jìn)入Shift-IR狀態(tài);
◆ 往TAP控制器的指令寄存器移入JTAG指令I(lǐng)NTEST(b1100);
◆ 使TAP控制器退出Shift-IR狀態(tài),進(jìn)入Shift-DR狀態(tài);
◆ 移入欲寫的數(shù)據(jù)D0~D31;
◆ 移入欲讀寫的EmbeddedICE寄存器的地址;
◆ 移入讀/寫位(讀為0,寫為1);
◆ 如果為讀,則移出讀到的EmbeddedICE寄存器的值D0~D31;
◆ 使TAP控制器退出Shift-DR狀態(tài),進(jìn)入Select-DR-Scan狀態(tài)。
3.3.3 EmbeddedICE寄存器操作模塊
EmbeddedICE寄存器的讀寫通過對(duì)掃描鏈2操作實(shí)現(xiàn)。讀時(shí),將欲讀的EmbeddedICE寄存器地址作為參數(shù)調(diào)用掃描鏈2操作函數(shù);寫時(shí),將欲寫的值和EmbeddedICE寄存器地址作為參數(shù)調(diào)用掃描鏈2操作函數(shù)。
3.3.4 高層調(diào)試命令模塊
通過調(diào)用掃描鏈操作模塊和EmbeddedICE寄存器操作模塊,實(shí)現(xiàn)了讀寫核寄存器、讀寫存儲(chǔ)器、斷點(diǎn)及觀察點(diǎn)操作、單步或全速運(yùn)行程序等高級(jí)調(diào)試控制命令。這些命令供主程序狀態(tài)機(jī)模塊調(diào)用。
3.3.5 USB接口驅(qū)動(dòng)模塊
USB接口驅(qū)動(dòng)模塊主要包含5個(gè)函數(shù):函數(shù)InitUSB()用于初始化USB模塊;函數(shù)USB_Polling()處理USB主機(jī)發(fā)來(lái)的USB標(biāo)準(zhǔn)設(shè)備請(qǐng)求,實(shí)現(xiàn)USB枚舉階段的傳輸過程,同時(shí)根據(jù)狀態(tài)寄存器的標(biāo)志位調(diào)用相應(yīng)的端點(diǎn)處理函數(shù);CTR(正確傳輸)中斷服務(wù)程序用于處理端點(diǎn)上發(fā)生的各種中斷;函數(shù)USB_RecvDataEP2(unsigned char *dp, uint8 len)和USB_SendDataEP2(unsigned char *dp, uint8 len)用于從端點(diǎn)2接收和發(fā)送USB包。
3.3.6 主程序狀態(tài)機(jī)模塊
主程序狀態(tài)機(jī)模塊循環(huán)調(diào)用USB接口驅(qū)動(dòng)模塊的USB_RecvDataEP2()函數(shù),接收調(diào)試器發(fā)來(lái)的命令報(bào)文,根據(jù)命令報(bào)文的主命令號(hào)和次命令號(hào)調(diào)用高層調(diào)試命令模塊的相應(yīng)命令函數(shù),并將命令函數(shù)返回的數(shù)據(jù)通過調(diào)用USB_SendDataEP2()函數(shù)返回給調(diào)試器,最終根據(jù)命令函數(shù)返回的狀態(tài)通過調(diào)用USB_SendDataEP2()函數(shù)發(fā)確認(rèn)報(bào)文給調(diào)試器。
結(jié)語(yǔ)
本文構(gòu)造了一個(gè)支持ARM核的嵌入式系統(tǒng)調(diào)試工具。它首先定義了一個(gè)輕量級(jí)的遠(yuǎn)程調(diào)試協(xié)議EmRDI,然后使用ST72651芯片實(shí)現(xiàn)了協(xié)議轉(zhuǎn)換器EmJTAG。目前該調(diào)試工具已經(jīng)應(yīng)用于實(shí)際嵌入式系統(tǒng)開發(fā)中,PC機(jī)上的調(diào)試器軟件可以通過EmJTAG下載程序到基于ARM核的目標(biāo)機(jī)上,并實(shí)現(xiàn)設(shè)置/清除斷點(diǎn)、設(shè)置/清除觀察點(diǎn)、全速/單步/停止運(yùn)行程序等基本的調(diào)試功能。
參考文獻(xiàn)
[1] ARM. The ARM7TDMI Debug Architechture,ARM DAI 0028A,1995-12.
[2] ARM. Using EmbeddedICE,ARM DAI 0031C,1999-02.
[3] ARM. ARM Architecture Reference Manual,ARM DDI 0100E,2000-06.
[4] ST. ST72651 DTC Specification,2002-01.
[5] ST. ST7265x Target Specification,2002-01.
[6] 張?zhí)煳? 通過USB和JTAG接口實(shí)現(xiàn)主機(jī)和DSP器件的通訊[D].
評(píng)論