嵌入式调试器原理和各类调试器集锦(JLINK、STLINK、CCDEBUG)

时间:2022-09-09 12:20:31

  工欲善其事,必先善其器。调试器在嵌入式开发调试中的重要性不言而喻,单步、断点和监察的效率远高于串口打印。但是,调试器对于一般开发人员往往是一个黑匣子。今天我们就来谈谈调试器的原理,顺便把自己的几类调试器接线和注意事项记录下来,以便查找。我常常要面对几个方案,而各个方案的调试器都不一样,接线有时连自己都记不住。所以这个帖子应值得嵌入式开发工程师收藏。

一、嵌入式调试多样性

  我们先来回想调试的场景,思考一下这几个问题:

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的官方文档资料。

嵌入式调试器原理和各类调试器集锦(JLINK、STLINK、CCDEBUG)

我们用这个架构图来一一解释上一节的问题,解开疑惑。

  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单片机,调试器必须要支持51CPU的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.

嵌入式调试器原理和各类调试器集锦(JLINK、STLINK、CCDEBUG)

3. 国内卖JLINK的厂商基本上都是抄人家的,所以自己在使用JLINK时也要以实测为准。我手上两个JLINK就截然不同。下图左边的JLINK,第19脚说是5v输出,实测是0。对于右边的JLINK的,1脚的VTref居然会输出V3.3,所以目标板可以直接以这个为电源来调试。对于左边的JLINK,目标板必须要提供电源给JLINK的1脚。

嵌入式调试器原理和各类调试器集锦(JLINK、STLINK、CCDEBUG)

4. JLINK可以支持STM32等cortexM3系列等等,A8等高级CPU也可以。蓝牙DA14580和NRF51822都是基于cortexM0,也可以。

2.STLINK

STLINK是ST公司研发的,专门针对ST公司的产品,一般支持SWD模式。原理跟上面接收的相仿。ST意法半导体还研发了STM8微控制器,其还有一种调试模式是SWIM单总线调试接口。即只需要一个口来调试,当然还要VCC,GND和RST口。

嵌入式调试器原理和各类调试器集锦(JLINK、STLINK、CCDEBUG)

3.TI的CC254X调试器

以上介绍的JTAG是20pin,其实JTAG还有10pin标准接口的,TI的CC254X调试器即是此种。

嵌入式调试器原理和各类调试器集锦(JLINK、STLINK、CCDEBUG)

4.51调试器

  一时找不到,不知道放到哪里了。

5. 其他调试,未完待续,这个帖子随时更新。

      嵌入式企鹅圈原创团队由阿里、魅族、nvidia、龙芯、炬力、拓尔思等资深工程师组成。百分百原创,每周两篇,分享嵌入式、Linux、物联网、GPU、Android、自动驾驶等技术。欢迎扫码关注微信公众号:嵌入式企鹅圈,实时推送原创文章!

嵌入式调试器原理和各类调试器集锦(JLINK、STLINK、CCDEBUG)

嵌入式调试器原理和各类调试器集锦(JLINK、STLINK、CCDEBUG)的更多相关文章

  1. struts2 javaweb 过滤器、监听器 拦截器 原理

    转: 过滤器.监听器 拦截器 过滤器 创建一个 Filter 只需两个步骤: (1)创建 Filter 处理类: (2)在 web.xml 文件中配置 Filter . 创建 Filter 必须实现 ...

  2. 【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705  参考博客 : [嵌入式开发]嵌入式 开发环境 (远 ...

  3. IE升级到10.0,VS2010启动调试时报“未能将脚本调试器附加到计算机..”

    IE升级到10.0,VS2010启动调试时报“未能将脚本调试器附加到计算机..” 今天,在调试代码时,调试器弹出提示框,报:未能将脚本调试器附加到计算机XXX上的进程iexplore.exe . 已附 ...

  4. CoreCLR源码探索(五) GC内存收集器的内部实现 调试篇

    在上一篇中我分析了CoreCLR中GC的内部处理, 在这一篇我将使用LLDB实际跟踪CoreCLR中GC,关于如何使用LLDB调试CoreCLR的介绍可以看: 微软官方的文档,地址 我在第3篇中的介绍 ...

  5. 大杀器:VS2017 查看或调试liunx代码(转载)

    From:https://blog.csdn.net/mumufan05/article/details/80094637 上一篇简单介绍了vs2017新建一个linux的工程,本编将介绍一下如何管理 ...

  6. 附录三 嵌入式C程序的编译与调试

    课程回顾 C语言库的特性和发展 C语言库的常用库函数 标准库函数的特色应用 git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysi ...

  7. 调试寄存器 原理与使用:DR0-DR7

    调试寄存器 原理与使用:DR0-DR7 下面介绍的知识性信息来自intel IA-32手册(可以在intel的开发手册或者官方网站查到),提示和补充来自学习调试器实现时的总结. 希望能给你带去有用的信 ...

  8. Win32调试API原理

    在Win32中自带了一些API函数,它们提供了相当于一般调试器的大多数功能,这些函数统称为Win32调试API(Win32 Debug API).利用这些API可以做到加载一个程序或捆绑到一个正在运行 ...

  9. Golang/Go goroutine调度器原理/实现【原】

    Go语言在2016年再次拿下TIBOE年度编程语言称号,这充分证明了Go语言这几年在全世界范围内的受欢迎程度.如果要对世界范围内的gopher发起一次“你究竟喜欢Go的哪一点”的调查,我相信很多Gop ...

随机推荐

  1. oracle小数点前零丢失的问题

    1.问题起源        oracle  数据库 字段值为小于1的小数时,使用char类型处理,会丢失小数点前面的0        例如0.2就变成了.2 2.解决办法: (1)用to_char函数 ...

  2. PHP 注册树模式

    /** * 注册树模式 * 将对象注册到一个类中 * 通过该类实现全局访问操作对象 */ class Tree { private static $treeList = []; private fun ...

  3. Samara SAU ACM ICPC 2013-2014 Quarterfinal Qualification Contest

    A: 简单题,因为题目中说了不会有数据相同: #include<cstdio> #include<algorithm> #define maxn 200005 using na ...

  4. 转&colon;sql语句中GROUP BY 和 HAVING和使用 count&lpar;&rpar;

    在开发时,我们经常会遇到以“累计(count)”或是“累加(sum)”为条件的查询.比如user_num表: id user num 1 a 3 2 a 4 3 b 5 4 b 7   例1:查询出现 ...

  5. JavaScript之Style属性学习

    当CSS使用伪类开始侵入DOM和JavaSCript所控制着的行为层时,DOM和JavaScript也使用他们的一系列样式去控制表现层,这篇随笔主要说的就是利用JavaScript去控制元素的表现形式 ...

  6. list对象数组,xpath复杂定位校验,POST入参为number数组,POST入参为JSON对象数组

    list对象数组: POST入参为number数组: {    "typeIds":[1,2,3]} POST入参为JSON对象数组,举例: [{    "itemId& ...

  7. 20172325 2018-2019-2 《Java程序设计》第六周学习总结

    20172325 2018-2019-2 <Java程序设计>第六周学习总结 教材学习内容总结 本周学习第十章--树 1.什么是树 (1)树是一种数据结构,与之前学过的栈.队列和列表这些线 ...

  8. jQuery - ajaxUpLoad&period;js

    ajaxFileUpload是一个异步上传文件的jQuery插件 语法:$.ajaxFileUpload([options]) options参数说明: 参数 作用 url 上传处理程序地址 file ...

  9. 【工具】我的Git学习日志

    使用github一段时间,一直使用的是可视化工具,配合公司转用git,提前联系下git的命令. 安装 windows上安装git 从git for windows下载安装包,我下的是Git-2.13. ...

  10. Python3红楼梦人名出现次数统计分析

    一.程序说明 本程序流程是读取红楼梦txt文件----使用jieba进行分词----借助Counter读取各人名出现次数并排序----使用matplotlib将结果可视化 这里的统计除了将“熙凤”出现 ...