百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术流 > 正文

嵌入式调试器原理和各类调试器集锦

citgpt 2024-08-10 15:17 9 浏览 0 评论

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

一、嵌入式调试多样性

嵌入式调试器原理和各类调试器集锦

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

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、自动驾驶等技术。

相关推荐

js中arguments详解

一、简介了解arguments这个对象之前先来认识一下javascript的一些功能:其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载。Javascrip中每个函数...

firewall-cmd 常用命令

目录firewalldzone说明firewallzone内容说明firewall-cmd常用参数firewall-cmd常用命令常用命令 回到顶部firewalldzone...

epel-release 是什么

EPEL-release(ExtraPackagesforEnterpriseLinux)是一个软件仓库,它为企业级Linux发行版(如CentOS、RHEL等)提供额外的软件包。以下是关于E...

FullGC详解  什么是 JVM 的 GC
FullGC详解 什么是 JVM 的 GC

前言:背景:一、什么是JVM的GC?JVM(JavaVirtualMachine)。JVM是Java程序的虚拟机,是一种实现Java语言的解...

2024-10-26 08:50 citgpt

使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
跨域(CrossOrigin)

1.介绍  1)跨域问题:跨域问题是在网络中,当一个网络的运行脚本(通常时JavaScript)试图访问另一个网络的资源时,如果这两个网络的端口、协议和域名不一致时就会出现跨域问题。    通俗讲...

微服务架构和分布式架构的区别

1、含义不同微服务架构:微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并...

深入理解与应用CSS clip-path 属性
深入理解与应用CSS clip-path 属性

clip-pathclip-path是什么clip-path 是一个CSS属性,允许开发者创建一个剪切区域,从而决定元素的哪些部分可见,哪些部分会被隐...

2024-10-25 11:51 citgpt

HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
Request.ServerVariables 大全

Request.ServerVariables("Url")返回服务器地址Request.ServerVariables("Path_Info")客户端提供的路...

python操作Kafka

目录一、python操作kafka1.python使用kafka生产者2.python使用kafka消费者3.使用docker中的kafka二、python操作kafka细...

Runtime.getRuntime().exec详解

Runtime.getRuntime().exec详解概述Runtime.getRuntime().exec用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。...

promise.all详解 promise.all是干什么的
promise.all详解 promise.all是干什么的

promise.all详解promise.all中所有的请求成功了,走.then(),在.then()中能得到一个数组,数组中是每个请求resolve抛出的结果...

2024-10-24 16:21 citgpt

Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解

取消回复欢迎 发表评论: