硬件设备二 调试分类、软/硬件断点、OpenOCD、JLink、STLink 使用

news2025/8/6 10:02:42

  近期工作开始主用 OpenOCD 来进行相关开发工作的调试,因此本文重点来学习一下!本文以 OpenOCD 为重点,辅以 JLink、STLink 作为对比来进行学习。

调试

本地调试

  本地调试通常指调试使用的环境与调试的目标运行环境一致的调试方法(也有一种说法,只要调试环境和目标运行环境都在调试员眼前那就是本地调试)。在实际开发环境中,调试时不需要连接到远程调试端的调试方式就被称为本地调试。 我们常用的 PC 程序开发的中的调试就是最常见的本地调试。
在这里插入图片描述

远程调试

  远程调试通常指调试环境与调试的目标运行环境不一致的情况下使用的调试方法(也有一种说法,如果要调试的目标运行环境不在调试员眼前的调试方法就是远程调试)。在实际开发环境中,调试时需要连接到远程调试端的调试方式就被称为远程调试。 远程调试在嵌入式开发和 PC 程序开发中都非常常见。
在这里插入图片描述

在线调试

  在线调试又叫附加调试(Attach Debug),即在线连接到正在运行的程序,而不重新下载调试程序的调试方式。在线调试可以在不破坏系统当前运行状态的前提下连接到运行的 CPU(连接后就和正常下载调试方式是一样了),从而方便查找现场问题。

嵌入式调试

  根据 IDE 中关于本地调试和远程调试的定义,在调试时,不需要连接远程调试端的调试方式就是本地调试,需要连接到远程调试端的调试方式就是远程调试,与调试环境和运行环境无关! 所以,使用仿真器调试芯片如果直接调试芯片就是本地调试,如果通过启用远程调试端则就属于远程调试。我们常用的仿真器 JLink、STLINK 等都同时提供本地调试和远程调试的能力。

The xPack Project

  xPack Project 是一个开源项目,旨在以可重复的方式提供一套跨平台工具来管理、配置和构建复杂的、模块化的、多目标(多架构、多板、多工具链)项目。其重点是 C/C++和裸机嵌入式项目。如下是一些常用工具(Eclipse CDT 插件就默认配置了这些工具):

  • xPack Windows Build Tools:包括在 Windows 上执行构建所需的额外工具(makerm 等)

  • xPack GNU Arm Embedded GCC:ARM 维护的官方 GNU ARM 嵌入工具链的一个代替,可以用于 Windows,MacOS和 GNU/Linux 平台。

  • xPack GNU RISC-V Embedded GCC:裸机 RISC-V GCC 发行版,由SiFive 维护。Windows、macOS 和 GNU/Linux 都有可用的二进制文件。

  • xPack OpenOCD:OpenOCD 的一个新发行版,为更好/更方便地与 OpenOCD 调试插件集成而定制。Windows、macOS 和GNU/Linux 都有可用的二进制文件。

  • xPack QEMU Arm:QEMU(开源机器仿真器)的一个分支,旨在为 Eclipse Embedded CDT 中 的Cortex-M 仿真提供支持。Windows、macOS 和 GNU/Linux都有可用的二进制文件。

断点

  断点是调试器 / 仿真器设置源程序在执行过程中自动进入中断模式的一个标记。当程序运行到断点时,程序中断执行(程序中断后,断点所在的行还没有执行)。通过设置断点可以查找程序运行时的错误,是调试程序常用的手段。

硬件断点

  硬件断点是由芯片内部的逻辑电路实现的,实际上就是芯片内的比较器,将当前 PC 值与比较器中的地址进行比较,当检测到指令地址总线上断点的地址值时,就会暂停 CPU 将控制权转移到调试器。

  硬件断点比软件断点更强大、更灵活,能够设置在代码的任何位置(FLASH、RAM),但是,CPU 只有有限数量的硬件断点(比较器)。ARM 7/9 内核有 2 个,Cortex-M 内核则有 4 ~ 8 个,x86 则通常为 4 个。

J-Link 支持一项名为 无限 Flash 断点(Unlimited Flash Breakpoints) 的调试功能,该功能允许用户在 Flash 中调试时设置无限数量的断点。

软件断点

  软件断点实际上是通过用断点指令替换要被断点的指令来设置的。断点指令存在于大多数 CPU 中,通常和最短的指令一样短,所以 x86 上只有一个字节(0xcc,INT 3)。在 Cortex-M CPU 上,指令是 2 或 4 字节,所以断点指令是一个 2 字节的指令。

  由于软件断点需要执行替换操作,所以软件断点只能设置在 RAM 里面,好处是基本不受数量的限制(理论不受限制,实际取决于使用的仿真器)!此外,软件断点还可以在替换指令时添加指定判断条件,因此,可分为无条件断点和有条件断点。如下是 Keil 中的 Access breakpoint 的设置界面:
在这里插入图片描述

调试器

  调试器是一个用来控制调试流程的软件程序,它解析调试文件并与用户交互、执行调试命令,并通过特定接口控制目标处理器运行。我们常见的 IDE(Visual Studio、Android Studio、Keil、IAR)内部都包含了一个 GUI 调试器(不能拿出来单独使用),也有一些可独立使用的调试器,例如,WinDBG,OllyDBG、IDA 是独立的 GUI 调试器,DGB、LLDB 则是独立的命令行调试器。

命令行调试器通常也搭配第三方 GUI 工具来组建成 GUI 调试环境,例如,Eclipse、VSCode、DGBGUI 等

GDB

  目前,大多数调试器都同时支持本地调试和远程调试,在嵌入式开发中,特定于架构的 GDB 是用的比较多的一个调试器。特定于架构的 gdb 调试器的远程调试最常用就是 gdbserver,他也是嵌入式中绝大部分远程调试的主要方式。
在这里插入图片描述
  gdb 调试器提供了两种不同的远程调试方法:stub(插桩)方式和 gdbserver 方式。其中,stub 方式则需要通过链接器把调试代理和要调试的程序链接成一个可执行的应用程序文件,而且 stub 需要修改异常处理和驱动程序等。gdbserver 是一个独立运行的单元,限制比较小,应用比较广泛。

仿真器

  仿真器又叫适配器(有时候也被称为调试器(Debugger)),对应的英文是 Adapter 或 Probe 或 Dongle,通常指嵌入式开发中的辅助调试的一个硬件设备,例如,JLink,ULINK、STLink 等。OpenOCD 列出几乎我们能见到的所有仿真器:https://openocd.org/doc/html/Debug-Adapter-Hardware.html。

  在线仿真(In-Circuit Emulation,ICE)原本是指的使用特殊硬件设备或在线模拟器来调试嵌入式系统的软件的方法。而如今,绝大多数芯片都支持 JTAG 调试接口,这种情况下可以在直接在目标芯片上调试,没有仿真,但是人们仍然使用仿真这个概念。

片上调试(On-Chip Debugging)是在线仿真的一种方法,目前最常用的实现方案就是 JTAG。

J-Link

  J-Link 是 SEGGER 退出的一款仿真器,也是目前使用最多的仿真器。J-Link 的驱动程序包里额外包含很多实用工具,这些工具通常被其他 IDE 集成,IDE 可以直接使用 J-Link 相关工具来实现调试芯片(本地调试)。同时,J-Link 也提供了一个名为 J-Link GDB Server 的程序来提供远程调试功能。
在这里插入图片描述

J-Link 还提供了一个名为 JLinkRemoteServer 的工具,这个是通过 SEGGER 的服务器中转从而可以实现通过公网远程调试

ST-LINK

  ST-LINK 是 ST 推出的一款仿真器,ST 官方还提供了配套的 The STM32CubeIDE ST-LINK GDB server 来提供对于 ST-LINK 的远程调试功能。此外,开源的 stlink 库也提供了一些使用工具,其中也包含提供远程调试的工具。
在这里插入图片描述

ST 还提供了一个名为 ST-LINK server 的工具,将一个 ST-LINK 仿真器虚拟为多个以供多个调试器使用

FTDI(FT2232)

  市面上有许多基于 Future Technology Devices International(FTDI)的 FT2232 芯片的 USB JTAG 仿真器。这一类仿真器通常使用 FT2232 作为主控芯片,大小及样式就和我们常见的 USB 转串口工具一样。如下是一些常见 USB JTAG 仿真器:
>
  FT2232 通常被用作 USB(全速 12 Mbps)转串口的芯片,该芯片非常灵活,可以支持一些传输配置,从而可以模拟出 JTAG 或 SWD 等接口。USB 这一层则是通过 USB HID 这类来进行访问。因此,FTDI 一类的仿真器就是被软件(OpenOCD)配置(模拟)的一个仿真器。
在这里插入图片描述
  FT2232 有两个多协议同步串行引擎(MPSSE)允许使用 JTAG,I2C 和 SPI 两个通道同时进行通信。多协议同步串行引擎 (MPSSE) 是某些 FTDI 客户端 IC 的一项功能,允许模拟多种同步串行协议,包括 SPI、I2C 和 JTAG。

PC 端可以通过相应 API 配置 MPSSE,从而实现不同接口功能

CMSIS-DAP

  CMSIS-DAP 是 ARM 为自家 Cortex 核的处理器制定的一个公开标准,同时该标准也是定义了支持访问 CoreSight 调试访问端口(DAP)的固件的实现方法(通信协议)。任何人都可以使用 CMSIS-DAP 来制作自己的调试器(现在网上有很多开源的 CMSIS-DAP 适配器(DAPLink))。
在这里插入图片描述
  最为主要的是,ARM 不仅制定了 CMSIS-DAP 标准,还顺带实现了一个 CMSIS-DAP 固件(注意,这只是个参考实现,如果实现自己的调试器还需要自己进一步完善),并且开源了源代码,其相关固件的源代码可以在 ARM 的 GITHUB 上找到,其基本目录如下:
在这里插入图片描述

CMSIS-DAP 固件源码就是一个 Keil 的项目工程,直接使用 Keil 打开修改编译即可

OpenOCD

  OpenOCD(Open On-Chip Debugger)是一个开源的跨平台的片上调试器,旨在提供针对嵌入式设备的调试、系统编程和边界扫描功能。其工作方式就是代替了原有那些调试适配器提供的相关工具, 直接通过 USB 驱动访问适配器,进而访问目标硬件。
在这里插入图片描述
  OpenOCD 对于各种仿真器支持是通过最底层的访问控制实现的(不经过适配器自己的驱动),因此,如果是搭配 J-Link、ST-Link 等适配器工作,则通常会提示 Warn : Failed to open device: LIBUSB_ERROR_NOT_FOUND。这个问题是由于当前系统中的 J-Link、ST-Link 驱动是他们原始的驱动,我们需要使用 zadig 或者 USBDriverTool 来更换仿真器的驱动为 libusb
在这里插入图片描述
  需要注意,切换驱动之后,J-Link、ST-Link 自带的那些实用工具(例如,J-Flash)将无法使用,Keil、IAR 这些 IDE 也无法再访问这些仿真器。 相比于 Zadig,使用 USBDriverTool 支持恢复仿真器原来的驱动程序。

  OpenOCD 支持大量的仿真器,包括但不限于各种加密狗、USB FT2232(FTDI) 系列、USB-JTAG / Altera USB-Blaster、J-Link、RLINK、ST-LINK 等等,官方文档 https://openocd.org/doc/html/Debug-Adapter-Hardware.html 有详细列表。如下以 STLink 为例,OpenOCD 的工作框图:
在这里插入图片描述
  OpenOCD 内部使用 GDB Server 启动一个远程调试端口(通过 GDB Server 连通 特定架构的 gdb 和硬件仿真器),以供各种调试器来访问。此外,OpenOCD 也提供 Telnet Server 和 TFTP Server 功能,以供用户直接使用命令来与 OpenOCD 进行交互。

使用

  OpenOCD 官方并没有发布任何预编译的二进制可执行程序,但是,一些优秀的社区成员在他们的网站上提供定期更新的二进制构建。其中使用最多的是 xPack Project 中的子项目 xPack OpenOCD 提供的多个平台的预编译二进制 。
在这里插入图片描述

  1. 官方 Github 仓库上配置了 CI/CD 会自动构建 Windows 二进制程序
  2. 某些设备供应商通常也会提供自己编译的 OpenOCD

  OpenOCD 是一个命令行可执行程序,本身支持的命令并不多。因此,使用非常简单,只需要向 OpenOCD 提供配置文件即可,所有的控制均在配置文件中指定。

  1. openocd -f xxx.cfg 如果有多个配置文件则可以多次使用 -f xxx.cfg 来指定多个配置文件
  2. gdb xxx 进入调试我们的程序模式
  3. target remote localhost:3333 连接到远程 gdbserver

配置

  OpenOCD 通过配置文件来实现对仿真器的控制进而与芯片通信。对于其所支持的仿真器及芯片,OpenOCD 了提供默认的配置文件,位于 xxxx/scripts 目录下(0.12.0 版本开始目录层级有改变,但是都是 scripts 目录下)。
在这里插入图片描述

  • 对于常见的开发板,则可以直接使用 board 目录下的配置文件(cpld 和 fpga 这俩目录就是一些针对常见 cpld 和 fpga 的配置文件)。例如:openocd -f board/stm32f4discovery.cfg
  • 如果是常用仿真器 + 常用芯片,则可以直接使用 interface 目录下的适配器配置 + target 目录下的芯片配置文件。例如: openocd -f interface/jlink.cfg -f target/stm32f7x.cfg
  • 如果是特殊仿真器 + 特殊芯片,则需要自己写一个配置文件

源码

  OpenOCD 是一个以 GPL 协议开源的软件,官方 Git 源代码存储库 可从 SF.net 获得。需要注意,其源码中还包含了三个Git 的 submodules,这个三个 submodule 需要手动下载源码。
在这里插入图片描述

  1. git2cl:这是一个将 git 日志转换为 GNU ChangeLog 格式的快速工具。该工具在内部调用 git log,除非你将日志管道传递给它。
    1. git2cl > ChangeLog
    2. git log --pretty --numstat --summary | ~/src/git2cl/git2cl > ChangeLog
  2. jimtcl:Tcl 编程语言的一个小型实现。Jim 是一个从零开始编写的 Tcl 编程语言的小型实现。目前,Jim Tcl 的功能非常完善。
  3. libjaylink:一个用 C 语言编写的共享库,用于访问 SEGGER J-Link 和兼容设备。

编译

编译非常简单,但是需要手动安装各种依赖包(sudo apt install libtool autoconf automake texinfo libusb-1.0-0-dev):

  1. ./bootstrap:执行该命令后就会生成 configure 脚本
  2. ./configure:执行该命令后就会生成 Makefile 文件
  3. make:编译
  4. make install:就会把编译好的二进制文件放到默认目录

参考

  1. https://arm-software.github.io/CMSIS_5/DAP/html/index.html
  2. https://openocd.org/doc/html/Debug-Adapter-Hardware.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/394180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux软件管理

软件管理 1、rpm管理工具 RPM是(Redhat Package Manager) 的缩写,由Red Hat公司提出的一种软件包管理标准 (1)rpm软件包的典型命名格式: 例:zsh-5.0.2-14.el8.x86_64.rpm zsh-50214el8x8664软件名主版本号次版本号…

day26_HTML

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、二阶段介绍 二、HTML 零、 复习昨日 见代码 一、二阶段介绍 第一阶段: 基础入门 java基本语法编程基础(方法,数组)面向对象编程常用类高级(IO,线程,新…

新增 IEC61850、Profinet 驱动

2 月,Neuron 团队主要侧重于开发新的驱动,新增了南向 IEC61850 驱动、南向 Allen-Bradley DF1 驱动、Profinet 驱动支持以及静态点位等功能,这些新驱动和新功能将在 2.4 版本中正式发布。 IEC61850 驱动 IEC61850 标准是电力系统自动化领域…

网络基础(2)

目录1. 端口号2. 套接字socket3. 网络通信3.1 sockaddr与sockaddr_in3.2 接口服务端3.2.1 创建套接字,打开网络文件3.2.2 给该服务器绑定端口和ip(特殊处理)3.2.3 初始化相关服务器3.2.4 提供服务客户端3.2.5 绑定3.2.6 使用服务4. makefile实…

关于 JavaScript 中的 Promises

在 JavaScript 中,Promise 是一个对象,它表示一个可能还不可用,但会在未来解决的值。Promises 用于处理异步操作,例如发出网络请求或访问数据库,其中结果不是立即可用的。如果你准备好了,我想开始我们的冒险…

基于SpringBoot+SpringCloud+Vue前后端分离项目实战 --开篇

本文目录前言做项目的三大好处强强联手(天狗组合)专栏作者简介专栏的优势后端规划1. SpringBoot 和 SpringCloud 的选择2. Mybatis 和 MybatisPlus 和 JPA 的选择3. MySQL 和 Mongodb 的选择4. Redis 和 RocketMQ5. 后端规划小总结后端大纲提前掌握的知识点一期SpringBoot二期S…

EventLoop机制

JavaScript 是单线程的语言 JavaScript 是一门单线程执行的编程语言。也就是说,同一时间只能做一件事情。 单线程执行任务队列的问题: 如果前一个任务非常耗时,则后续的任务就不得不一直等待,从而导致程序假死的问题。 同步任…

机器学习和深度学习的综述

机器学习和深度学习的综述 1.1.1人工智能、机器学习、深度学习的关系 人工智能(Artificial Intelligence,AI)是最宽泛的概念,是研发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。由于这个定义…

代码随想录算法训练营第二十一天打卡 | 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

打卡第21天,继续二叉树,前几天终于补完了,感觉难度上来了。 今日任务 530.二叉搜索树的最小绝对差501.二叉搜索树中的众数 二叉树的最近公共祖先 530.二叉搜索树的最小绝对差 给你一个二叉搜索树的根节点 root ,返回 树中任意两不…

计算机网络——路由、交换、子网篇

子网掩码 解释1 作者:纪言 链接:https://www.zhihu.com/question/56895036/answer/447915532 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 仅限ip4首先子网掩码这名字取得很好&#xff0c…

Java创建线程的方式只有一种:Thread+Runnable

Java创建线程的方式其实只有一种👨‍🎓一、继承Thread👨‍🎓二、实现Runnable接口👨‍🎓三、实现Callable接口👨‍🎓四、通过线程池创建👨‍🎓五、总结一般我…

SOLID 原则要这么理解!

什么是 SOLID 原则 SOLID 原则其实是用来指导软件设计的,它一共分为五条设计原则,分别是: 单一职责原则(SRP)开闭原则(OCP)里氏替换原则(LSP)接口隔离原则(…

Matter 系列 #9|乐鑫 Matter 预配置服务加速设备生产

乐鑫 Matter 系列文章 #9 目录 Matter 预配置服务 1. 设备认证 (Device Attestation) 2. 独特性 (Uniqueness) 3. 安全性 (Security) 联系我们​​​​​​​ 如今,物联网行业蓬勃发展,大量市场参与者正在积极地构建 Matter 智能设备。 乐鑫一直致…

盲盒开发:多元化设计、数字化销售、可持续发展

随着互联网的发展,盲盒成为了一种新型文化现象和玩具消费方式。它不仅满足了人们的消费需求,也引发了人们对玩具和收藏品的热爱和追求。目前,盲盒市场已经逐渐发展成为一个庞大的产业,其中海外盲盒市场更是异彩纷呈,备…

Git安装初始化及Gitee上传提交步骤

一、git安装git下载https://git-scm.com/download/win直接点击下一步“next”安装即可在桌面右键,选择 Git Bash Here 在 Git Bash Here 终端里输入 git --version 查看 git 版本,如图所示,说明 Git 安装成功。在终端设置用户签名邮箱git con…

windows7安装sql server 2000安装步骤 及安装过程中遇到的问题和解决方式

提示:文章写完后windows7安装sql server 2000安装步骤 及安装过程中遇到的问题和解决方式, 文章目录一、ms sql server 2000是什么?版本简介:**特点:****优点:**二、步骤1.下载安装包及Sq4补丁包2.安装 ms …

淘宝 APP 网络架构演进与弱网破障实践

作者:沈良炜 阿里大淘宝终端体验平台团队 面对移动互联网络下复杂多变的网络环境,如何提供更稳定可靠的请求性能,保障用户的加载浏览体验?本文将为大家分享淘宝APP统一网络库的演进。 一、引言 自2013年ALLIN无线到今天&#xff0…

ESP32设备驱动-土壤湿度传感器驱动

土壤湿度传感器驱动 1、土壤湿度传感器介绍 土壤湿度传感器由两个探头组成,用于测量水的体积含量。 两个探头让电流通过土壤,然后得到电阻值来测量水分值。 当有更多的水时,土壤会传导更多的电,这意味着电阻会更小。 因此,水分含量会更高。 干燥的土壤导电性差,所以当…

第八章.贝叶斯分析—贝叶斯定理朴素贝叶斯

第八章.贝叶斯分析 8.1 贝叶斯定理&朴素贝叶斯 贝叶斯主要应用与新闻分类,文本分类,评论分析。 1.数理统计学处理的信息 1).贝叶斯方法 关于统计推断的系统理论和方法,称为贝叶斯方法。 2).经典统计学 总体信息:当前总体样…

【2223sW2】LOG2

写在前面 好好学习,走出宿舍,走向毕设! 一些心路历程记录,很少有代码出现 因为鬼知道哪条代码到时候变成毕设的一部分了咧,还是不要给自己的查重挖坑罢了 23.3.2 检验FFT 早上师兄帮忙看了一眼我画的丑图&#xff…