近期工作开始主用 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

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

  1. Linux嵌入外部程序窗口,μClinux嵌入系统外部硬件设备快速调试||μClinux|

    μClinux嵌入系统外部硬件设备快速调试 摘要:为 了加快开发调试μClinux嵌入式系统的外部硬件设备,采用直接物理地址的设备访问方法,在μClinux嵌入式系统中实现了外部硬件设备的快速访问. ...

  2. WIN7计算机管理里没有便携设备,如何显示及删除Win7设备管理器中隐藏的已用过的硬件设备信息(图)...

    一.创建"devmgr_show_nonpresent_devices"变量 先右击桌面的"计算机"图标,依次选择"属性→高级系统设置",打 ...

  3. 【Windows 逆向】OD 调试器工具 ( OD 调试数据时硬件断点对应的关键代码 | 删除硬件端点恢复运行 )

    文章目录 前言 一.OD 调试数据时硬件断点对应的关键代码 二.删除硬件端点恢复运行 前言 在 [Windows 逆向]OD 调试器工具 ( CE 中获取子弹动态地址前置操作 | OD 中调试指定地址 ...

  4. 磁共振线圈分类_磁共振硬件(二)主磁体分类

    一切从基础做起,从简单开始! -------青花瓷讲师团 本节主要介绍主磁体系统的分类.  前面"磁共振理论"中讲解的磁共振现象的过程,即给处于主磁场中的人体组织一个射频脉冲(RF ...

  5. 硬件设备(门禁人脸识别机)调试总结

    公司让我开发几个对接硬件设备(门禁人脸识别机)等,有多台不同型号的人脸识别机,每种型号需要参考不同的厂家协议,再开发过程中遇到了很多坑,故需要将这些坑提炼出来,避免以后继续踩坑,如下: 硬件设备需要配 ...

  6. 美颜SDK如何接入到硬件设备实现美颜拍摄?

    很多小伙伴在使用美颜SDK时经常遇见一些技术类的疑难问题,一时间不知道从何下手.下文,小编将为大家讲解一下常见的美颜SDK问题解决方案,以便自行处理. 在此之前,我们先来了解一下目前美颜SDK最大的技 ...

  7. linux设备usb节点和硬件接口,所谓设备驱动即驱使硬件设备行动,带你深入理解linux的设备驱动......

    原标题:所谓设备驱动即驱使硬件设备行动,带你深入理解linux的设备驱动... 设备驱动最通俗的解释就是"驱使硬件设备行动".操作系统是通过各种驱动程序来驾驭硬件设备的,它为用户屏 ...

  8. S7-1500+TIA+MCD:西门子仿真与虚拟调试的硬件在环调试流程

    本号相关PPT与资料,未在文末留下下载关键字的,需进入智能制造之家知识星球自行下载~ 写在前面 前面我们介绍了西门子.达索.罗克韦尔等诸多数字化工厂仿真软件: 一文了解西门子.达索.施耐德.罗克韦尔等 ...

  9. 微型计算机的软 硬件组成,微型计算机的软、硬件组成及主要性能指标

    满意答案 u67r54wy 2013.07.31 采纳率:49%    等级:10 已帮助:1922人 一.局域网的类型 1.按拓扑结构分类:局域网经常采用总线型.环型.星型和混和型拓扑结构,因此可以 ...

最新文章

  1. 【Apollo源码分析】系列的第三部分【prediction】_slamcode的博客 -CSDN博客
  2. 用友服务器整体迁移--数据库附加
  3. 第11章:项目风险管理(2)—章节重点
  4. mongodb安装.
  5. Android 8.0 Oreo 形为变更之 Notification Channels
  6. 安装linux前分区,安装Linux系统前的准备之磁盘分区
  7. ssm医院疫情隔离室管理系统答辩PPT模板
  8. Android Activity 生命周期
  9. 计算机体系结构五大部分组成
  10. 数据库习题(填空题四)
  11. JN5169_EEPROM_PDM
  12. 如何把大写金额变为小写数字_人民币金额(数字)大小写转换在线工具
  13. iOS开发捷径学习(一)
  14. 【微信H5开发】the permission value is offline verifying
  15. 苹果官方付费升级内存_vivo推出内存扩容服务:良心还是坑钱?
  16. 微信小程序style的动态样式使用-三元表达式
  17. chrome extension 拓展插件添加google analytics统计
  18. 创业合伙人要用心挑!不能凑合!
  19. python解释器环境中用于表示上一次运算结果的特殊变量_知到智慧树_中国画基础_作业题库答案...
  20. 若泽大数据-剑指数仓培训笔记1

热门文章

  1. 华为 WATCH GT 3跑步分段功能怎么用?
  2. java latin1编码_从java查询latin1列
  3. dede建站mysql_织梦二次开发建站
  4. 基于qq.maps.com的web地图定位导航
  5. FineReport学习(二)——各种报表的制作
  6. Photoshop 2020 入门到精通视频教程共57节课程
  7. vue上传(兼容IE9)
  8. 视觉SLAM十四讲学习笔记-第五讲-相机模型
  9. Linux USB 驱动
  10. Vuetify—— 使用v-badge