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

一、嵌入式调试多样性

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

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

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

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

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、自动驾驶等技术。欢迎扫码关注微信公众号:嵌入式企鹅圈,实时推送原创文章!

嵌入式调试器原理和各类调试器集锦(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. maven pox.xml 设置主入口配置节点

    <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven ...

  2. Python单元测试框架之pytest -- 断言

    对于测试来讲,不管是功能测试,自动化测试,还是单元测试.一般都会预设一个正确的预期结果,而在测试执行的过程中会得到一个实际的结果.测试的成功与否就是拿实际的结果与预期的结果进行比较.这个比的过程实际就 ...

  3. [Python]爬虫v0.1

    #coding:utf-8 import urllib ###### #爬虫v0.1 利用urlib2 和 字符串内建函数 ###### # 获取网页内容 def getHtml(url): page ...

  4. LitePal + Gson + Volley的ORM框架尝试方案

    为了紧跟技术潮流,目前的项目开始采用ORM的思想进行重新设计. 数据库采用轻量级ORM框架LitePal,Json解析采用Gson,网络框架采用Volley. 如果只是单纯的将这些第三方框架引进来,事 ...

  5. Hekaton的神话与误解

    最近这段时间,我花了很多时间来更好的理解Hekaton——SQL Sever 2014里的全新内存表技术.我看了很多文章,了解了Haktaon的各种内部数据存储结构(主要是哈希索引和Bw-tree). ...

  6. js-弹出窗口

    一.JS最常用三种弹出对话框 1.对话框 //弹出对话框并输出一段提示信息 function ale() { //弹出一个对话框 alert("提示信息!"); } 2.询问框 / ...

  7. Vim杂记:markdown插件

    一.安装插件 从以下地址下载压缩包 github下载:https://github.com/plasticboy/vim-markdown plasticboy下载:http://plasticboy ...

  8. 价值100W的经验分享: 基于JSPatch的iOS应用线上Bug的即时修复方案,附源码.

    限于iOS AppStore的审核机制,一些新的功能的添加或者bug的修复,想做些节日专属的活动等,几乎都是不太可能的.从已有的经验来看,也是有了一些比较常用的解决方案.本文先是会简单说明对比大部分方 ...

  9. 前端js的书写规范和高效维护的方案_自我总结使用的方案

    作为程序员,人生最值得幸福的事有几件: 解决困扰了很长时间的问题 升职加薪 找个漂亮又靠谱的对象 深得领导的喜欢 带领团队冲锋陷阵 ... 哈哈,这些都是梦想,暂时想想就好了.这肯定和我说的东西不符合 ...

  10. 【助教】Java获取数据库数据展示

    本文将给出一个最简单的Java查询数据库中一张表的数据并将查询结果展示在页面的例子. 实际上,我们要解决以下两个问题: Java与数据库交互(以JDBC为例) 数据展示在前台页面(以Servlet+J ...