请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】
OpenOCD (Open On-Chip Debugger) 是一个开源的硬件调试器,可以提供调试、芯片编程和边界扫描等功能。OpenOCD使用标准的JTAG接口与芯片进行通信,因此,可以用于各种不同的硬件平台,包括 ARM 和 MIPS等。
OpenOCD最初是为了支持ARM7和ARM9微控制器而开发的,但现在已经支持大量的设备,包括Cortex-M、Cortex-A、Cortex-R、PowerPC和RISC-V等架构的微控制器和处理器。除了JTAG接口,OpenOCD还支持SWD (Serial Wire Debug) 和cJTAG (Compact JTAG) 等接口。
OpenOCD 的主要功能包括:
在嵌入式开发中,OpenOCD是一个非常重要的工具,它可以极大地方便开发人员进行代码的调试和硬件的测试。OpenOCD 的功能需要调试适配器来辅助完成,适配器是一种硬件设备,它允许开发者通过JTAG接口与嵌入式设备进行通信。JTAG 适配器通常用于编程、调试和测试嵌入式系统。
JTAG 适配器通常连接到开发者的电脑和嵌入式设备的 JTAG 接口之间。电脑端通常使用 USB 或以太网接口,而设备端则使用特定的JTAG连接器。一些开发板直接集成了调试仿真器,如小熊派开发板就集成了STLink。
开发者可以通过 JTAG 适配器和配套的软件工具进行各种操作,例如:
以下是一些常见的 JTAG 适配器的例子:
以下是使用 OpenOCD 的三个主要步骤的详细介绍:
.cfg
扩展名。my_config.cfg
,你可以运行 openocd -f my_config.cfg
来启动 OpenOCD。gdb
命令并附加到 OpenOCD 进程来开始调试。所支持的 JTAG 适配器有以下:
AICE, AM335x, ARM-JTAG-EW, ARM-USB-OCD, ARM-USB-TINY, AT91RM9200, axm0432, BCM2835,
Bus Blaster, Buspirate, Cadence DPI, Cadence vdebug, Chameleon, CMSIS-DAP,
Cortino, Cypress KitProg, DENX, Digilent JTAG-SMT2, DLC 5, DLP-USB1232H,
embedded projects, Espressif USB JTAG Programmer,
eStick, FlashLINK, FlossJTAG, Flyswatter, Flyswatter2,
FTDI FT232R, Gateworks, Hoegl, ICDI, ICEBear, J-Link, JTAG VPI, JTAGkey,
JTAGkey2, JTAG-lock-pick, KT-Link, Linux GPIOD, Lisa/L, LPC1768-Stick,
Mellanox rshim, MiniModule, NGX, Nuvoton Nu-Link, Nu-Link2, NXHX, NXP IMX GPIO,
OOCDLink, Opendous, OpenJTAG, Openmoko, OpenRD, OSBDM, Presto, Redbee,
Remote Bitbang, RLink, SheevaPlug devkit, Stellaris evkits,
ST-LINK (SWO tracing supported), STM32-PerformanceStick, STR9-comStick,
sysfsgpio, Tigard, TI XDS110, TUMPA, Turtelizer, ULINK, USB-A9260, USB-Blaster,
USB-JTAG, USBprog, VPACLink, VSLLink, Wiggler, XDS100v2, Xilinx XVC/PCIe, Xverve.
这里介绍下 FTDI,FTDI 是 Future Technology Devices International 的简称,这是一家专门生产 USB 连接设备和模块的公司。FTDI 的产品广泛应用于各种设备和系统中,其中包括一些 JTAG 适配器。
在 OpenOCD 中,可以使用 FTDI 的设备作为 JTAG 或 SWD 的接口。OpenOCD 通过 D2XX 驱动或 libFTDI 库与 FTDI 设备进行通信。使用 FTDI 设备作为 JTAG 或 SWD 接口,可以方便地在 USB 接口和目标设备之间建立连接,从而实现对目标设备的编程和调试。
OpenOCD 支持的 FTDI 设备包括但不限于:
以上设备都可以作为 JTAG 或 SWD 适配器,但是需要正确配置其引脚映射和信号电平。这可以通过编写 OpenOCD 配置文件来实现。
再介绍下 J-Link ,它由 Segger 公司开发的一套专业级的调试探头,广泛应用于各种嵌入式系统的开发和调试。J-Link 支持 JTAG, SWD (Serial Wire Debug), 和 cJTAG (Compact JTAG) 等多种调试协议,并支持各种不同的目标设备,包括 ARM Cortex, Renesas RX, Microchip PIC32 等。
OpenOCD 也支持 J-Link 调试探头。可以通过 OpenOCD 结合 J-Link,在使用时需要在 OpenOCD 的配置文件中指定 J-Link 作为调试接口。以下是一个使用 J-Link 的 OpenOCD 配置文件的例子:
source [find interface/jlink.cfg]
transport select swd
source [find target/stm32f1x.cfg]
在以上配置文件中,interface/jlink.cfg
是 OpenOCD 预定义的 J-Link 接口配置文件,transport select swd
指定使用 SWD 协议,target/stm32f1x.cfg
是目标设备的配置文件,这个例子中是一个 STM32F1x
系列的设备。
除了使用 OpenOCD,Segger 也提供了自家的调试软件,例如 J-Link GDB Server,可以和 GNU Debugger (GDB) 直接集成,提供更加完善的调试功能。
ARM: AArch64, ARM11, ARM7, ARM9, Cortex-A/R (v7-A/R), Cortex-M (ARMv{6/7/8}-M),
FA526, Feroceon/Dragonite, XScale.ARCv2, AVR32, DSP563xx, DSP5680xx, EnSilica eSi-RISC,
EJTAG (MIPS32, MIPS64), ESP32, ESP32-S2, ESP32-S3, Intel Quark, LS102x-SAP, NDS32,
RISC-V, ST STM8, Xtensa.
ADUC702x, AT91SAM, AT91SAM9 (NAND), ATH79, ATmega128RFA1, Atmel SAM, AVR, CFI,
DSP5680xx, EFM32, EM357, eSi-RISC, eSi-TSMC, EZR32HG, FM3, FM4, Freedom E SPI,
GD32, i.MX31, Kinetis, LPC8xx/LPC1xxx/LPC2xxx/LPC541xx, LPC2900, LPC3180, LPC32xx,
LPCSPIFI, Marvell QSPI, MAX32, Milandr, MXC, NIIET, nRF51, nRF52 , NuMicro,
NUC910, Nuvoton NPCX, onsemi RSL10, Orion/Kirkwood, PIC32mx, PSoC4/5LP/6,
Raspberry RP2040, Renesas RPC HF and SH QSPI,
S3C24xx, S3C6400, SiM3x, SiFive Freedom E, Stellaris, ST BlueNRG, STM32,
STM32 QUAD/OCTO-SPI for Flash/FRAM/EEPROM, STMSMI, STR7x, STR9x, SWM050,
TI CC13xx, TI CC26xx, TI CC32xx, TI MSP432, Winner Micro w600, Xilinx XCF,
XMC1xxx, XMC4xxx.
代码获取
git
获取 git clone git://git.code.sf.net/p/openocd/code openocd
http://repo.or.cz/r/openocd.git
git://repo.or.cz/openocd.git
源码编译
运行 $ ./configure
命令,进行OpenOCD配置,可配置的项目可以通过 $ ./configure -h
命令查看帮助信息。 笔者的调试器是 J-Link,所以还要运行如下命令进行使能
$ ./configure --enable-jlink
$ sudo make install
安装完成后,运行 $ openocd -V
命令,查看当前软件版本。
举例来说,假设你正在使用一个 STM32F4 Discovery 开发板,可以直接使用命令openocd -f board/stm32f4discovery.cfg
启动OpenOCD, vim openocd-0.12.0/tcl/board/stm32f4discovery.cfg
可以看到下面内容:
# my_config.cfg # 适配器配置
source [find interface/stlink.cfg]
transport select hla_swd
# increase working area to 64KB
set WORKAREASIZE 0x10000
# 目标硬件配置
source [find target/stm32f4x.cfg]
reset_config srst_only
使用的规则:
find
命令和参数FILENAME
是放在[]中,命令返回的是该文件的完整路径(文件名不要用‘#
’,‘#
’是TCL的关键字);source
命令使用find
到的文件,并以把这个文件作为脚本执行。如果当前使用的是一个不常见的适配器来debug一些目标设备,就需要source jtag interface 和 target configs。例如:
openocd -f interface/ftdi/jtagkey2.cfg -c "transport select jtag" \
-f target/ti_calypso.cfg
openocd -f interface/stlink.cfg -c "transport select hla_swd" \
-f target/stm32l0.cfg
在另一个终端中,你可以启动 GDB 并连接到 OpenOCD:
arm-none-eabi-gdb -ex "target remote localhost:3333"
此时,你就可以使用 GDB 来进行调试了。例如,你可以使用 continue
命令来开始执行程序,或者使用 break
命令来设置断点。
以上就是 OpenOCD 的基本使用方法。在实际使用中,你可能需要根据你的具体硬件和需求来调整配置文件和 GDB 命令。
推荐阅读:
https://zhuanlan.zhihu.com/p/41517198
https://openocd.org/doc-release/html/TAP-Declaration.html#DAP-subcommand-apreg
https://bbs.huaweicloud.com/blogs/122621