JTAG调试原理.ppt

上传人:李医生 文档编号:9290684 上传时间:2021-02-15 格式:PPT 页数:55 大小:2.31MB
返回 下载 相关 举报
JTAG调试原理.ppt_第1页
第1页 / 共55页
JTAG调试原理.ppt_第2页
第2页 / 共55页
JTAG调试原理.ppt_第3页
第3页 / 共55页
JTAG调试原理.ppt_第4页
第4页 / 共55页
JTAG调试原理.ppt_第5页
第5页 / 共55页
点击查看更多>>
资源描述

《JTAG调试原理.ppt》由会员分享,可在线阅读,更多相关《JTAG调试原理.ppt(55页珍藏版)》请在三一文库上搜索。

1、JTAG调试原理,目录,一、JTAG基本知识 1.1、什么是JTAG 1.2 、 JTAG的作用 1.3、 JTAG调试结构 二、 JTAG的工作原理 2.1、两个重要概念:边界扫描和TAP 2.2、JTAG的状态机 2.3、 ARM7TDMI内核结构 2.4、 JTAG扫描链结构及工作过程 2.5、 EmbeddedICE-RT Logic的结构 2.6、 EmbeddedICE的断点/观察点设置 三、 JTAG常用指令,一、JTAG基本知识,1.1、 什么是JTAG JTAG是Joint Test Action Group(联合测试行动组)的缩写,是IEEE1149.1标准。 1.2 、

2、JTAG的作用 使得IC芯片固定在PCB版上,只通过边界扫描便可以被测试。 1.3、 JTAG调试结构,(1)、DEBUG主控制器: 运行有ARM公司或是第三方提供的调试软件的PC机。如:ARM公司提供的ADS、LINUX下的arm-elf-gdb等。通过这些调试软件,可以发送高级调试命令,如:设置/取消断点,读写MEMORY,单步跟踪,全速运行等。,(2)、协议转换器(Protocol converter) 负责将Debug主控端发出的高级ARM调试命令转换为底层的ARM JTAG调试命令。 Debug主控端和协议转换器间的介质可以有很多种,如:Earthnet、USB,串口,并口等。 De

3、bug主控端和协议转换器间的通信协议可以是ARM公司的ANGEL标准,也可以是第三方自定义的标准。典型的协议转换器有:ARM公司的Multi-ICE,H-JTAG,JLink等。,H-JTAG运行界面,J-Link的运行界面,(3)、调试目标机 系统的调试对象。典型的ARM7TDMI内核的调试结构:,二、JTAG的工作原理,2.1、两个重要概念:边界扫描和TAP (1)边界扫描(Boundary-Scan): 基本思想:在靠近芯片输入/输出管脚上增加一个移位寄存器单元(边界扫描寄存器)。 正常状态下,边界扫描寄存器对芯片来说是透明的,所以正常的运行不会受到任何的影响。,调试状态下,边界扫描寄存

4、器将芯片和外的输入输出隔离开,通过这些边界扫描寄存器可以实现对芯片输入输出信号的控制。具体控制过程如下: 、输入管脚:通过与之相连的边界扫描寄存器把信号(数据)加载到该管脚中去。 、输出管脚:通过与之相连的边界扫描 寄存器“捕获”该管脚上的输出信号。,注意: 芯片输入输出管脚上的边界扫描寄存器单元可以相互连接起来,在芯片周围形成一个边界扫描链。该链可以实现串行的输入输出,通过相应的时钟信号和控制信号,可方便的观察和控制在调试状态下的芯片。,(2)、TAP(Test Access Port) TAP是一个通用的端口,利用它可以访问芯片提供的所有DR和IR。对整个TAP的控制是通过TAP Cont

5、roller来完成的。 TAP包括5个信号接口: TCK(Test Clock Input) JTAG时钟信号位。标准强制要求 TMS(Test Mode Select) 测试模式选择,通过该信号控制JTAG状态机的状态。TMS在TCK的上升沿有效。标准强制要求,TDI(Test Data Input) 数据输入口。所有要输入到特定寄存器的数据都是通过TDI口一位一位串行输入的(TCK驱动)。标准里强制要求 TDO(Test Data Output) 数据输出口。所有要从特定的寄存器中输出的数据都是通过TDO口串行的一位一位输出的(TCK驱动)。标准里强制要求 TRST(Test Reset

6、Input) JTAG复位信号。标准里是可选的,2.2、JTAG的状态机,TAP共有16个状态机,如下图所示: 每一个状态都有其相应的功能。箭头表示了所有可能的状态转换流程。状态的转换是由TMS控制的。,2.3、ARM7TDMI内核结构,ARM7TDMI处理器结构框图:,ARM7TDMI处理器包括三大部分: ARM CPU Main Processor Logic 包括了对调试的硬件支持 Embedded ICE-RT Logic 包括一组寄存器和比较器,用来产生调试异常,设置断点和观察点。 TAP Controller 通过JTAG接口来控制和操作扫描链,ARM7TDMI还提供了3个附加的信

7、号: DBGRQ : 调试请求,通过把DBGREQ置 “1”,可以迫使ARM7TDMI进入调试状态 DBGACK :调试确认,通过DBGACK,可以判断当前ARM7TDMI是否在调试状态 BREAKPT :断点信号,这个信号是输入到ARM7TDMI处理器内核的,2.4、JTAG扫描链结构及工作过程,ARM7TDMI的框图提供了3条扫描链: Scan Chain 0 113个扫描单元,包括ARM所有的I/O,地址/数据总线和输入/输出控制信号。此链很复杂,不易控制,但包含信息丰富,可通过它得到ARM7TDMI内核的所有信息。 Scan Chain 1 33个扫描单元,包括数据总线和一个断点控制信

8、号。,Scan Chain 2 38个扫描单元,通过控制EmbeddedICE宏单元,实现对ARM进行指令的断点、观察点的控制。 其实还有个Scan Chain 3,ARM7TDMI可以访问外部的边界扫描链。只不过很少用,在此不做介绍。想了解可以看ARM7TDMI手册。,一个典型的JTAG链:,JTAG扫描链的工作过程,2.5、EmbeddedICE-RT Logic的结构,通过对EmbeddedICE控制,以及通过对EmbeddedICE中寄存器的读取,可以获得ARM内核的状态,为程序设置断点观察点以及读取Debug通信通道(DCC)。 这里的断点用来标识某个地址上的一条指令,而观察点用来观

9、察某个地址上的数据变化,所以这二者是有区别的。DCC用来完成主调试器和目标机间的信息发送。,EmbeddedICE的结构如下:,EmbeddedICE的长度是38位,包括: 32位数据 5位地址,访问EmbeddedICE中的寄存器 1个读写控制位 EmbeddedICE的寄存器主要包括Debug状态和控制寄存器,Debug通信寄存器和断点设置相关的寄存器,如下图所示:,EmbeddedICE的寄存器,EmbeddedICE寄存器格式及含义,Debug Control Register 格式: DBGACK:用来控制DBGACK信号的值 DBGRQ:是调试请求信号,通过将该信号置“1”,可以强

10、制ARM7TDMI暂停当前的指令,进入调试状态 INTDIS:用来控制中断 SBZ/RAZ:任何时候都必须被置“0”,Monitor Mode Enable:用来控制是否进入Monitor模式 EmbeddedICE-RT Disable:用来控制整个EmbeddedICE-RT,是启用还是禁用 Debug Status Register 格式: DBGACK:用来标识当前系统是否处于调试状态。1,表示进入;0,表示未进入。,DBGRQ:用来标识DBGRQ信号的当前状态 IFEN:用来标识系统的中断控制状态:启用 还是禁用 cgenL:用来判断当前对调试器在调试状态下对内存的访问是否完成 TB

11、IT:该位用来判断ARM7TDMI是从ARM 状态还是THUMB状态进入到调试状态的,Abort Status Register 格式:,该寄存器的长度为1,来判断一个异常的产生的原因:断点触发?观察点触发?还是一个真的异常?,实例1:用Scan Chain 2 设置Debug Control Register,1)、 选择扫描链2,将其连接到TDI,TDO 之间。具体过程如下: 通过TAP将SCAN_N指令写入到指令寄存器当中去, TAP状态转换如下:RUN-TEST/IDLESELECT-DR-SCAN SELECT-IR-SCAN CAPTURE-IR SHIFT-IR EXIT1-IR

12、 UPDATE-IR RUN-TEST/IDLE,在SHIFT-IR状态下,将SCAN_N通过TDI写到指令寄存器中去;接下来,访问被SCAN_N指令连接到TDI,和TDO之间的扫描链选择寄存器,通过将2写入到扫描链选择寄存器当中去,以将扫描链2连接到TDI和TDO之间。将2写入扫描链选择寄存器的状态转换如下: RUN-TEST/IDLE SELECT-DR-SCAN CAPTURE-DR SHIFT-DR EXIT1-DR UPDATE-DR RUN-TEST/IDLE 在SHIFT-DR状态下,将数值2通过TDI写到扫描链选择寄存器当中去。 2)、将Scan Chain 2置为内测试模式

13、用INTEST 指令实现该操作,指令写入与SCAN_N指令的过程类似,3)、写Debug Control Register 假设要将Debug Control Register的6位全部置“1”,按照扫描链2的格式,需要写入到扫描链2第序列应该为: 1,00000,0000,0000,0000,0000,0000,0000,0011,1111 1表示写操作,00000标识的是Debug Control Register的地址,中间32位是要写入到Debug Control Register的数据。因Debug Control Register长度为6,所以只有低6位的数据序列111111有效。

14、,将上面长度为38位的序列写入到扫描链2中,TAP状态转换过程如下: RUN-TEST/IDLE SELECT-DR-SCAN CAPTURE-DR SHIFT-DR EXIT1-DR UPDATE-DR RUN-TEST/IDLE 在SHIFT-DR状态下,通过38个TCK时钟驱动,就可以将上面的序列串行输入到扫描练2当中去。在回到RUN-TEST/IDLE状态后,Debug Control Register的值就会被改写为111111。,EmbeddedICE有两个WtchPoint单元。下面介绍一下WatchPoint寄存器的使用: EmbeddedICE的一个主要作用是可以在ARM程序

15、中设置软件或硬件断点。在EmbeddedICE中,集成了一个比较器,负责把ARM处理器取指的地址A31:0,数据 D31:0以及一些控制信号与EmbeddedICE中WatchPoint寄存器中设置的数值相比较(具体说应该是进行与或运算),比较结果用来确定输出一个ARM断点(BreakPoint)信号。具体运算关系如下公式所描述:,2.6、EmbeddedICE的断点/观察点设置,Av31:0,Cv4:0 XOR A31:0,C4:0 OR Am31:0,Cm4:0 = 0 xFFFFFFFF 当上述表达式值为真时,断点/观察点信号有效,ARM内核进入Debug模式。 ARM中断点和观察点的设

16、置 首先介绍一下与之设置密切相关的WP Control Value/Mask Register。 WP Control Value/Mask Register格式:,WP Control Value/Mask Register格式含义:,ENABLE: 如果该位置0的话,意味着断点触发条件永远不成立,也就是把全部断点都给disable掉了 RANGE: 暂时不会用 CHAIN: 暂时不会用 EXTERN: 外部到EmbeddedICE-RT的输入,通过该输入,可以使得断点的触发依赖于一定的外部条件 nTRANS: 用来判断是在用户态下还是非用户态下,用户态下:nTRANS = 0,否则nTRA

17、NS = 1,nOPC: 检测当前的周期是取指令还是进行数据访问。nOPC=0,表示当前周期进行取指。 nOPC=1,表示当前周期进行普通数据的访问。(该位用的较多) MAS1:0: 和ARM7TDMI的MAS1:0信号进行比较,以探测当前总线的宽度是8位、16位还是32位 nRW: nRW = 0, 当前的是读周期,nRW = 1,当前的是写周期,断点设置的两种方式: 1)、硬件断点: 通过设置EmbeddedICE中的WP和地址相关的寄存器来实现的。通过该方式设置的断点数受到WP数目的限制。因ARM7TAMI中仅有两组WP,故最多可以设置两个断点。但是,硬件断点可在任何地方设置不受存储类型

18、限制。,2)、软件断点 通过设置EmbeddedICE中的WP和数据相关的寄存器来实现的。分为两步: (1)、将data value和data mask设为ARM的未定义指令,通常是一个特殊的32位数字,如:0 xCDCDCDCD (2)、在需要设置断点的地方将其内容替换,为(1)中的特殊数字。这样,一但程序运行到该位置,尝试从该位置取指令或者数据的时候,因为取得的数据值和WP Data Value寄存器的值相同,ARM7TDMI会暂停当前的运行,自动进入调试状态。 由上所述,软件断点数目不受ARM内核中WP数目的限制。但是,软件断点是通过替换系统断点地址的指令实现的,所以,软件断点只能在可写

19、的存储器空间中设置,如:RAM。而不能在FLASH,ROM中设置。,总之,有两个WP的ARM7TDMI内核中,断点设置有如下情况: 2个硬件断点,没有软件断点。 1个硬件断点,任意个软件断点。 没有硬件断点,任意个软件断点。 观察点设置: 将WP Address Value寄存器的值设置为需要观察的地址,WP Address Mask寄存器的值设置为0 x00000000。将WP Data Mask寄存器的值设置为0 xFFFFFFFF。同时nPOC = 1。另外,,WP Data Value/Mask Register也用来设置观察点,用以观察某个地址的数据变化。每当系统访问(读/写)完被观

20、察地址的数据的时候,ARM7TDMI就会进入调试状态,这样,我们就可以马上检查该地址上的数据。,实例2:读取通用寄存器R0的值(以下操作默认已进入调试状态),1)、选择扫描链1 具体过程同选择扫描链2相同 2)、将扫描链1置为内测模式 3)、插入指令STR R0, R0 & BREAKPT = 0 这步相当于指令STR R0, R0的取指令周期(3级流水线) 4)、插入空指令MOV R0, R0 & BREAKPT = 0 这一步读取新指令MOV R0, R0,同时,相当于指令STR R0, R0的译指令周期(3级流水线),5)、插入空指令MOV R0, R0 & BREAKPT = 0 这一

21、步,STR R0, R0指令处在第1个指令执行周期,在该周期,先执行地址计算 6)、通过扫描链1读出捕获数据总线上的数据 在这一步,指令STR R0, R0继续执行,指令STR R0, R0处在第2个指令执行周期。在这一步,寄存器R0的值会被放到数据总线上去,指令STR R0, R0执行完毕。所以,在这一步,从扫描链中读出的数据就是寄存器R0的值。,三、JTAG常用指令,指令名称 二进制代码 JTAG_EXTEST 0 x0 JTAG_SCAN_N0 x2 JTAG_SAMPLE_PRELOAD0 x3 JTAG_RESTART0 x4 JTAG_CLAMP0 x5 JTAG_HIGHZ0 x7 JTAG_CLAMPZ0 x9 JTAG_INTEST0 xC,指令名称 二进制代码 JTAG_IDCODE0 xE JTAG_BYPASS0 xF,谢谢大家,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1