摘要 設計實現一個適用于基于EmJTAG的ARM嵌入式系統調試工具。它首先定義了一個輕量級的遠程調試協議EmRDI,用于PC機與基于EmJTAG的ARM目標板之間的交互過程;然后描述了用意法半導體公司(ST)的ST72651芯片實現一個協議轉換器EmJTAG的技術細節。EmJTAG的功能就是將PC機的調試命令轉換成目標板的JTAG時序信號,以達到控制PC機和調試目標板的目的。
關鍵詞 EmRDI EmJTAG 邊界掃描 遠程調試 協議轉換器
引言
ARM嵌入式系統的大致開發流程是:先在PC機上編寫程序源代碼;由ARM的交叉編譯器編譯、鏈接生成一個目標文件;然后將目標文件轉化成可以下載到目標機運行的二進制代碼,在目標機上調試運行;最終將調試成功的二進制文件固化在目標機中。這一系列過程中,最關鍵的步驟就是在PC機上調試在目標機上運行的程序。這就需要采用遠程調試的方式,即在PC機上運行調試器軟件,被調試程序在目標機上運行。
本文描述了這樣一個遠程調試系統:利用USB批量傳輸的可靠性,將遠程調試協議EmRDI的報文封裝在USB數據包中;協議轉換器EmJTAG再根據接收到的USB數據包中的協議信息,轉換成適當的JTAG信號來控制和調試ARM核。協議轉換器EmJTAG由ST公司的ST72651芯片外加一片接口驅動芯片74LVC244來實現。ST72651內部集成了USB模塊和數據傳輸協處理器部件(DTC),通過對DTC的編程來產生控制ARM核的邊界掃描序列,以產生相應的JTAG信號。
文章最終實現了PC機對ARM核的目標機的調試功能:PC機的調試器軟件可以下載程序至目標機,實時控制目標機上代碼的單步/全速運行或停止,以及設置斷點和觀察點、讀寫寄存器/存儲器等。
1? 系統組成及原理
如圖1所示,整個調試系統包括三部分: PC機(調試器)、協議轉換器(EmJTAG)以及目標板(基于ARM核)。調試的目的是實現在PC機上控制目標板單步或全速運行,并可以實時地察看或修改寄存器及存儲器的值。
系統設計實現了一個遠程調試協議EmRDI,它采用點對點的連接方式,以請求響應的方式進行交互。調試請求由PC機上的調試器軟件發出,經由USB總線傳輸至協議轉換器EmJTAG;EmJTAG解讀該協議請求,在執行相應的操作之后,以USB數據包的形式發送回PC機(即響應過程)。
EmRDI協議定義了如下一些調試請求: 讀/寫核寄存器、讀/寫存儲器、設置/清除硬件斷點、設置/清除軟件斷點、設置/清除數據觀察點、復位、停止運行、全速/單步運行和返回處理器狀態/設備標識符。經驗證,這些請求的組合,可以實現PC機對目標機上ARM核的調試和控制功能。
EmRDI協議請求格式(16字節)如下:
EmRDI協議響應格式(8字節)如下:
ARM核的芯片基本上都遵循JTAG規范,并帶有邊界掃描功能,此類芯片內集成了一個JTAG電路結構。JTAG電路由TAP(測試訪問端口)、TAP控制器、指令寄存器、測試數據寄存器組成。另外,ARM7TDMI核還包含了一個提供在線調試支持的EmbeddedICE宏單元。
EmJTAG和PC機通過USB總線連接,與目標板則遵循JTAG調試接口標準。JTAG規范中,使用稱為“邊界掃描單元”的基本結構。邊界掃描單元將JTAG電路與處理器邏輯電路聯系起來,通過它可以將一個輸入信號加載到處理器邏輯中而不影響邏輯的其他電路,也可以將處理器邏輯的輸出信號采樣到邊界掃描單元中。若干個邊界掃描單元構成邊界掃描寄存器(BSR),也稱為“邊界掃描鏈”。邊界掃描寄存器的數據通過JTAG接口的TDI引腳和TDO引腳串行移進移出。
PC機上需要實現:EmJTAG的USB驅動程序和調試器軟件。
EmJTAG上需要實現:USB固件程序和用于產生JTAG信號的邊界掃描程序。
2? 硬件設計和實現
系統的硬件部分主要是指協議轉換器EmJTAG的實現。協議轉換器的功能,就是接收PC機上調試器軟件發送的遠程調試協議信息,將它轉換成JTAG時序信號發送到目標板,然后把目標板的反饋信息或者數據返回給PC機的調試器軟件。
EmJTAG使用意法半導體(ST)公司的ST72651芯片,原理框圖如圖2所示。它集成了1個全速(12 Mbps)USB接口模塊,1個時鐘頻率為24 MHz的數據傳輸協處理器(DTC),32 KB程序存儲空間,5 KB RAM,硬件I2C和SPI接口,多達47個可編程I/O口;工作電壓為2.7~5.5 V,由USB直接供電。
與PC機通信方面,USB接口部分只需要將DP腳上拉一個電阻,使PC機識別到USB設備。DTC模塊產生4個時鐘信號作為JTAG時鐘信號(TDI、TDO、TMS和TCK),由I/O口引出,外部再加一個接口驅動芯片74LVC244,將這4個信號連接到標準的JTAG接口上。TAP控制器復位信號nTRST和系統復位信號nSRST通過I/O邏輯直接控制。
EmJTAG采用USB供電方式,同時在TCK引腳上連接一個指示燈BUSY,顯示系統是否處于忙狀態。接口驅動芯片74LVC244由內部集成的電壓校準器產生3.3 V來提供電壓。
3? 軟件設計和實現
軟件部分主要包括: PC機上的調試器軟件,EmJTAG協議轉換器的PC端驅動程序以及EmJTAG中的固件程序。
3.1? PC機上的調試器軟件
采用VC++ 6.0 MFC。其主要功能是與EmJTAG的PC端驅動程序通信,將調試命令通過USB總線發送至EmJTAG。
3.2? EmJTAG的PC端驅動程序
使用Driverstudio3.1開發Windows下的USB驅動程序,使EmJTAG和PC機的應用程序可以進行數據交互。
3.3? EmJTAG中的固件程序
固件程序使用意法半導體(ST)開發工具STVD7 for InDART STX進行開發。這一部分也是調試系統最重要的部分,即如何產生JTAG時序信號控制ARM核。EmJTAG中的固件分成以下多個模塊實現。
3.3.1? DTC軟件插件程序模塊
DTC功能框圖如圖3所示。DTC是ST72651內部集成的數據傳輸協處理器,也是一個通用的串行/并行通信接口。通過改變其內運行的插件程序,DTC可以方便地完成不同的高速數據傳輸操作。插件程序(最大為256字節)開始時存放在ST72651的Flash中,芯片運行的程序會將插件程序加載到DTC SW RAM中,然后控制DTC運行這段插件程序。ST7核也可以讀寫DTC的數據傳輸緩沖區,因此需要有一個仲裁電路用于防止ST7核和DTC訪問該緩沖區時發生沖突。DTC有一套簡單的指令集。ST7核通過DTC控制寄存器DTCCR控制DTC的操作,通過DTC狀態寄存器DTCSR查詢DTC的狀態,通過DTC指針寄存器DTCPR改變DTC的操作指針。
DTC有4種操作狀態: 空閑狀態(IDLE),加載插件程序狀態(RAMLOAD),運行狀態(RUNNING)和改變操作指針狀態(POINTERCHANGE)。通過改變DTCCR寄存器的RUN、INIT和LOAD位可以實現4種狀態間的轉換。
將插件程序加載到DTC SW RAM中的步驟如下:
◆ 清除DTCCR寄存器的RUN位,使DTC進入IDLE狀態,停止DTC;
◆ 設置DTCCR寄存器的LOAD位,使DTC進入RAMLOAD狀態,以允許寫DTC RAM;
◆ 將插件程序復制到DTC SW RAM中;
◆ 清除DTCCR寄存器的LOAD位,使DTC返回到IDLE狀態,恢復DTC RAM寫保護。
使DTC運行其RAM(即DTC SW RAM)中的插件程序的步驟如下:
◆ 清除DTCCR寄存器的RUN位,使DTC進入IDLE狀態,停止DTC;
◆ 將插件程序的起始地址填入DTCPR寄存器中;
◆ 設置DTCCR寄存器的INIT位,使DTC進入POINTERCHANGE狀態,將DTCPR寄存器中的值復制到DTC中;
◆ 清除DTCCR寄存器的INIT位,使DTC返回到IDLE狀態;
◆ 設置DTCCR寄存器的RUN位,使DTC進入RUNNING狀態,開始運行。
DTC運行的插件程序實現的功能是: 將數據傳輸緩沖區內的數據快速移出I/O口,或者從I/O快速移入數據到數據傳輸緩沖區中。DTC操作的I/O口作為4個JTAG信號: TCK、TMS、TDI和TDO。TCK作為移入/移出數據的觸發時鐘;TDI作為移出數據出口;TDO作為移入數據進口;TMS作為輸入信號,與TCK一起決定TAP控制器狀態的轉移過程。插件程序用DTC匯編指令編寫,然后通過ST公司提供的一個簡單匯編器將匯編源代碼轉化成DTC機器指令,燒寫到ST72651的Flash存儲器中。
3.3.2? 掃描鏈操作模塊
掃描鏈操作模塊調用DTC軟件插件程序,完成初始化TAP控制器、掃描鏈1操作和掃描鏈2操作。
(1)??初始化TAP控制器
TAP控制器的基本功能是產生時鐘信號和控制信號。它包括一個帶有16個狀態的有限狀態機: Test-Logic-Reset狀態、Run-Test/Idle狀態、Select-DR-Scan狀態、Select-IR-Scan狀態、Capture-DR狀態、Shift-DR狀態、Exit1-DR狀態、Pause-DR狀態、Exit2-DR狀態、Update-DR狀態、Capture-IR狀態、Shift-IR狀態、Exit1-IR狀態、Pause-IR狀態、Exit2-IR狀態和Update-IR狀態。
初始化TAP控制器的目的是使TAP控制器進入Select-DR-Scan狀態。無論當前TAP控制器處于什么狀態,只要在TMS為1時產生5個TCK信號,TAP控制器就進入Test-Logic-Reset狀態。因此,使TAP控制器進入Select-DR-Scan狀態的步驟為: 首先使TMS為1,產生5個TCK信號,使TAP控制器進入Test-Logic-Reset狀態;然后使TMS為0,產生1個TCK信號,使TAP控制器進入Run-Test/Idle狀態;最后使TMS為1,產生1個TCK信號,使TAP控制器進入Select-DR-Scan狀態。
(2)? 掃描鏈1操作
掃描鏈1是JTAG電路中的一種測試數據寄存器,主要用于內核測試和調試過程。
掃描鏈1有33位,按掃描先后順序依次為: BREAKPT位(輸入),D31~D0(輸入/輸出)。掃描鏈1操作的目的是移入BREAKPT位,同時向/從數據總線移入/移出 32位數據。操作步驟如下:
◆ 初始化TAP控制器,使TAP控制器進入Select-D-RScan狀態;
◆ 使TMS為1,產生1個TCK信號,使TAP控制器進入Select-IR-Scan狀態;
◆ 使TMS為0,產生2個TCK信號,使TAP控制器進入Shift-IR狀態;
◆ 往TAP控制器的指令寄存器移入JTAG指令SCAN_N(b0010);
◆ 使TAP控制器退出Shift-IR狀態,進入ShiftDR狀態;
◆ 往掃描鏈選擇寄存器移入b0001,選擇掃描鏈1;
◆ 使TAP控制器退出Shift-DR狀態,進入Shift-IR狀態;
◆ 往TAP控制器的指令寄存器移入JTAG指令INTEST(b1100);
◆ 使TAP控制器退出Shift-IR狀態,進入Shift-DR狀態;
◆ 移入BREAKPT位,移入數據D31~D0(或移出數據D31~D0);
◆ 使TAP控制器退出Shift-DR狀態,進入Select-DR-Scan狀態。
(3)? 掃描鏈2操作
掃描鏈2也是一種測試數據寄存器,用于訪問EmbeddedICE宏單元的寄存器。
掃描鏈2有38位,按掃描先后順序依次為:EmbeddedICE寄存器的D0~D31,EmbeddedICE寄存器的A0~A4,讀/寫位。掃描鏈2操作的目的是讀寫EmbeddedICE宏單元的寄存器。操作步驟如下:
◆ 初始化TAP控制器,使TAP控制器進入Select-DR-Scan狀態;
◆ 使TMS為1,產生1個TCK信號,使TAP控制器進入Select-IR-Scan狀態;
◆ 使TMS為0,產生2個TCK信號,使TAP控制器進入Shift-IR狀態;
◆ 往TAP控制器的指令寄存器移入JTAG指令SCAN_N(b0010);
◆ 使TAP控制器退出Shift-IR狀態,進入Shift-DR狀態;
◆ 往掃描鏈選擇寄存器移入b0010,選擇掃描鏈2;
◆ 使TAP控制器退出Shift-DR狀態,進入Shift-IR狀態;
◆ 往TAP控制器的指令寄存器移入JTAG指令INTEST(b1100);
◆ 使TAP控制器退出Shift-IR狀態,進入Shift-DR狀態;
◆ 移入欲寫的數據D0~D31;
◆ 移入欲讀寫的EmbeddedICE寄存器的地址;
◆ 移入讀/寫位(讀為0,寫為1);
◆ 如果為讀,則移出讀到的EmbeddedICE寄存器的值D0~D31;
◆ 使TAP控制器退出Shift-DR狀態,進入Select-DR-Scan狀態。
3.3.3? EmbeddedICE寄存器操作模塊
EmbeddedICE寄存器的讀寫通過對掃描鏈2操作實現。讀時,將欲讀的EmbeddedICE寄存器地址作為參數調用掃描鏈2操作函數;寫時,將欲寫的值和EmbeddedICE寄存器地址作為參數調用掃描鏈2操作函數。
3.3.4? 高層調試命令模塊
通過調用掃描鏈操作模塊和EmbeddedICE寄存器操作模塊,實現了讀寫核寄存器、讀寫存儲器、斷點及觀察點操作、單步或全速運行程序等高級調試控制命令。這些命令供主程序狀態機模塊調用。
3.3.5? USB接口驅動模塊
USB接口驅動模塊主要包含5個函數: 函數InitUSB()用于初始化USB模塊;函數USB_Polling()處理USB主機發來的USB標準設備請求,實現USB枚舉階段的傳輸過程,同時根據狀態寄存器的標志位調用相應的端點處理函數;CTR(正確傳輸)中斷服務程序用于處理端點上發生的各種中斷;函數USB_RecvDataEP2(unsigned char *dp, uint8 len)和USB_SendDataEP2(unsigned char *dp, uint8 len)用于從端點2接收和發送USB包。
3.3.6? 主程序狀態機模塊
主程序狀態機模塊循環調用USB接口驅動模塊的USB_RecvDataEP2()函數,接收調試器發來的命令報文,根據命令報文的主命令號和次命令號調用高層調試命令模塊的相應命令函數,并將命令函數返回的數據通過調用USB_SendDataEP2()函數返回給調試器,最終根據命令函數返回的狀態通過調用USB_SendDataEP2()函數發確認報文給調試器。
結語
本文構造了一個支持ARM核的嵌入式系統調試工具。它首先定義了一個輕量級的遠程調試協議EmRDI,然后使用ST72651芯片實現了協議轉換器EmJTAG。目前該調試工具已經應用于實際嵌入式系統開發中,PC機上的調試器軟件可以通過EmJTAG下載程序到基于ARM核的目標機上,并實現設置/清除斷點、設置/清除觀察點、全速/單步/停止運行程序等基本的調試功能。
參考文獻
[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] ?張天武. 通過USB和JTAG接口實現主機和DSP器件的通訊[D]. 西安: 西安交通大學,200304.
姜立娣(碩士研究生)、沈建華(副教授),主要研究方向為嵌入式系統結構。
(收稿日期:2007-04-28)
評論
查看更多