工欲善其事,必先善其器。调试器在嵌入式开发调试中的重要性不言而喻,单步、断点和监察的效率远高于串口打印。但是,调试器对于一般开发人员往往是一个黑匣子。今天我们就来谈谈调试器的原理,顺便把自己的几类调试器接线和注意事项记录下来,以便查找。我常常要面对几个方案,而各个方案的调试器都不一样,接线有时连自己都记不住。所以这个帖子应值得嵌入式开发工程师收藏。
一、嵌入式调试多样性
我们先来回想调试的场景,思考一下这几个问题:
1. ARM开发环境有Keil、IAR、ADS等等,我们发现这几个平台都能用同一个调试器去调试ARM。
2.一个调试器可以调试多种不同型号的CPU,包括STM32控制器和高端的处理器。
3.一个调试器有时接20个pin的JTAG接口,有时接4个pin的SWD接口。
4.开发环境KEIL不仅支持ARM调试,还支持51单片机调试。
5.如果自己研发了一颗SOC芯片,并在JTAG的基础上增加一些定制的功能,又该如何实现?
二、JLink调试原理
OK,我们来分析一下JLINK的调试架构。我们都知道,JLINK是调试ARM体系的。
网上的资料有时旧了,有时抄来抄去出错了。我们就以官方的版本为例来说明。我们安装了JLINK驱动后,会在Doc\Manuals目录有一个文件《UM08001_JLink.pdf》,这个文件就是Jlink的官方文档资料。
我们用这个架构图来一一解释上一节的问题,解开疑惑。
1.对于第一个问题,JLINK定义了一个软件调试层面的RDI接口标准,即Remote debug interface. Keil、IAR、ADS这些开发环境按照RDI标准进行定制,即可以支持JLINK调试。RDI底层使用USB传输,当然,其他硬件接口也是可以的。
2.对于第三个问题,ARM体系原先是支持JTAG硬件调试接口的,随着cortex系列增加SWD调试规范,现在越来越多的调试器选择SWD接口。其接线少,速率高,也比较稳定。JTAG 20个口太占用pin资源了。JLINK V6开始支持SWD,现在V8支持已经足够好了。
3.对于第二个问题,不管是低端控制器,还是高端处理器,调试接口规范都是ARM体系的标准内容。ARM CPU原生支持JTAG/SWD调试协议接口。
OK,那JLINK这个角色是做什么的?
-----将RDI接口协议转换为JTAG/SWD接口协议!!!
例如,IDE上可以设置一个断点,那IDE会使用RDI的设置断点的API,而JLINK在实现这个API里面,就转化为JTAG/SWD标准规范里面的设置断点功能,并通过JTAG/SWD硬件接口输出到ARM CPU上。
三、IDE的调试开发
第四个和第五个问题都涉及到IDE。如何回答这两个问题?
1.从JLINK架构来看,调试包括:IDE->远程调试接口->调试器->硬件调试接口->CPU。
2.对于KEIL支持51单片机,调试器必须要支持51 CPU的ISP调试规范。51单片机的调试似乎没有一家像JLINK那么有影响力的调试厂商。也许是因为51调试器相当简单吧,淘宝30块左右就能买到。
那现在就剩下远程调试接口这个环节了,这个问题解决了,就把第五个问题也解决了,因为不管是通用的SOC,还是定制的SOC,CPU核心都是一致的,要么是ARM,要么是MIPS,要么51等等。每种CPU在其体系标准里面就决定了硬件调试规范了。要想调试CPU,其调试器必须要将上层的要求转化为符合其支持的硬件调试规范。
那么,我们来重新思考IDE的设计。IDE在立项研发的时候显然希望能支持到不同体系的CPU,否则不是作死自己吗?所以,我们可以想象,IDE其实也面向第三方调试厂商开放自己的接口。这样各大厂商才能利用已经成熟的IDE。
所以,我们来重新回答第四和第五个问题:
3.IDE->第三方厂商实现KEIL的接口->第三方厂商的远程调试接口->第三方调试器->硬件调试接口->CPU. 所以,我们在JLINK架构图中看到,RDI接口其实是JLINK厂商定义的接口,而不是IDE厂商定义的。
4.第四个问题:KEIL->第三方厂商实现KEIL的接口->第三方厂商的远程调试接口->第三方调试器->51调试规范->51 CPU
5.第五个问题:从以上看来,其实第三方调试器厂商是可以在实现硬件调试规范的基础上,对于远程调试接口做灵活的定制的。甚至可以,在一款调试器的基础上,实现支持多种CPU。一般集成电路设计公司,都有自己的调试器,其要开发多种CPU体系的芯片,所以自己研发的调试器肯定能够多种不同的CPU的。
Ok,原理就说到这里,大家应该对调试器有较为深入的理解了吧。对于硬件调试规范,以后有时间再细谈吧。
四、ARM各类调试汇总
1. JLINK
1. JLINK有不同的软件版本。不同版本的pin脚定义可能不一样,尤其是VCC. 这点,我倒是记忆犹新。
2.jlinkV6开始支持SWD模式。
JLINK的JTAG/SWD调试接口。VTref是输入,接目标板的VDD.
3. 国内卖JLINK的厂商基本上都是抄人家的,所以自己在使用JLINK时也要以实测为准。我手上两个JLINK就截然不同。下图左边的JLINK,第19脚说是5v输出,实测是0。对于右边的JLINK的,1脚的VTref居然会输出V3.3,所以目标板可以直接以这个为电源来调试。对于左边的JLINK,目标板必须要提供电源给JLINK的1脚。
4. JLINK可以支持STM32等cortex M3系列等等,A8等高级CPU也可以。蓝牙DA14580和NRF51822都是基于cortex M0,也可以。
2. STLINK
STLINK是ST公司研发的,专门针对ST公司的产品,一般支持SWD模式。原理跟上面接收的相仿。ST意法半导体还研发了STM8微控制器,其还有一种调试模式是SWIM单总线调试接口。即只需要一个口来调试,当然还要VCC,GND和RST口。
3. TI的CC254X调试器
以上介绍的JTAG是20pin,其实JTAG还有10pin标准接口的,TI的CC254X调试器即是此种。
4.51调试器
一时找不到,不知道放到哪里了。
5. 其他调试,未完待续,这个帖子随时更新。
欢迎关注微信公众号:嵌入式企鹅圈,实时推送原创文章!
嵌入式企鹅圈原创团队由阿里、魅族、nvidia、龙芯、炬力、拓尔思等资深工程师组成。百分百原创,分享嵌入式、Linux、物联网、GPU、Android、自动驾驶等技术。