问几个CPU的debug方式的问题
我的问题是:
1. Host端通过JTAG与Target的MCU相连接。而这两者间通信的物理层协议是规定好的JTAG的协议。我想Host要控制MCU单步执行的,是通过JTAG发送一些“指令”到MCU的debug的controler里面,然后再由这个controller控制MCU的PC。这些“指令”(我暂时称之为数据链路层协议)是谁规定的?还是JTAG么?
2.通过JTAG下载firmware,这个时候MCU是处于复位状态,等到下载完成,reset起来,MCU的PC从0开始运行(通常)。那么是不是JTAG下载完成之后,通过某一个“指令”告诉debug controller说我搞定了,然后再通知reset controller重启?而这个数据链路层的协议也是定好的?谁定义的?各个MCU不同么?ARM和MIPS会相同么?
3.回到前面的单步执行。这个是通过控制MCU的时钟来实现的么?比如我进入debug模式,MCU的时钟停下来,然后我一单步执行,就会来一个(或者若干个)MCU的始终,使得PC指针可以往前走?我的猜测是否正确?
4.如果是host端设置断点,实际的过程是,通过JTAG将断点的地址发送给MCU的debug controller,然后让MCU开始运行,同时有一个块逻辑去比较断点和当前的PC值,如果二者相同,那么MCU的时钟就停下来,等待Host继续的命令。我的猜测是否正确?
5.上面提到的断点,其实在逻辑上需要用到实实在在的寄存器存储断点地址,因此一个MCU的硬件断点资源是有限的。这个断点和软件层面上的断点是不一样的。软件断点是需要在程序里面插东西,而硬断点不需要。我的理解是否正确?
6.再说watch point。我知道GDB是有watch point的说法,是指某一个变量变化的时候就停下来。软件上我好理解,比如我的程序中有一个变量a,当a变化的时候,程序停下来,软件的watch point我觉得还好做,因为软件层面上,他知道a是什么。然而硬件上呢?硬件上只有地址的概念,他并不关a还是b,他怎么知道是哪个变量的值发生了变化?硬件的watch point是怎么实现的?
好吧,暂时就这么多问题。不知道我是否描述清楚。
谢谢!
呃
我觉得我有些地方想错了
但是还没有完全想通
re一个,同想知道。
JTAG能够读写哪些寄存器是需要在芯片设计的时候就定义好的吗?还是缺省所有寄存器都能读写?
JTAG最大的优势是串行链的结构特别省资源还是别的什么?
jtag+一个控制单元可以在bus上作主,想读什么都能读。
jtag调试cpu是跟cpu内部的debug单元接口。
jtag只提供串进串出和spec上的几个特殊功能,bebug单元怎么写还是cpu自己定义的。
JTAG接口及其控制器只是提供了一种从外部访问CPU内部东东的机制,CPU内部还需要有相应的片上调试电路来实现具体调试操作,而所谓“协议”或者“指令”的格式就是由各个厂商自行定义——JTAG只不过被用来“传递调试命令”。
处理器内核一般会提供一个Run/Stall引脚在控制处理器的运行/停止状态,例如在加载程序时,可以设置这个引脚让处理器暂停运行。这个引脚不一定直接引到片外,它可以由寄存器控制,而这个寄存器可以通过JTAG接口访问。
处理器内核还有一个“调试异常”概念(DEBUG EXCEPTION),这个调试异常可以通过如下机制产生:
·执行BREAK指令
·指令地址匹配断点
·数据地址匹配断点
·外部调试中断
......
当调试异常发生后,处理器可以通过运行在其中的软件进行处理(软处理),也可以通过片上调试电路来处理(硬处理),后者就是你提到的通过JTAG接口来实现单步等等调试操作。
总之,片上调试电路决定了处理器的硬件可调试能力,调试异常电路决定了各种异常触发机制(后续既可以是软件调试,也可以是硬件调试)。
谢谢!
看起来jtag主要是作为一个通道? 它作为一个通道来说比起USB或ETHERNET优势是什么?简单?
JTAG 有通用的国际规范,芯片厂商自己实现对应的解释逻辑;
JTAG 每一个通讯中每一个Bit 的解释,由芯片常识负责解释并执行;
通常这需要芯片的Arch 设计时就决定了。
对于大多数客户,用软件封好的东西好了;不需要太关心细节;