openocd的使用问题汇总 + PlatformIO IDE调用openocd调试注意事项

前言

使用openocd,可以适配大批的调试器,真正做到一个软件驱动所有。但是现阶段的使用,如果没有仔细阅读官方的使用说明,或者对自己用的芯片不熟悉,会产生大量的问题。
最好的办法是先阅读一遍openocd官方的文档,有了一定的基础以后,再结合自己所用的芯片进行调整。

一条原则:出了问题,不要完全归结于官方给出的Script有问题。主动去检查错误发生的根本原因

Permission Deny

基本上只出现在linux上,windows是不会有这个的
这个很明显是权限问题。也就是openocd没有权限看到、操作调试器。
解决方法(两种):

  1. 使用root来执行openocd -f interface/xxx.cfg -f target/xxx.cfg
  2. 打开目录openocd/contrib,linux:/usr/share/openocd/contrib,将dd-openocd.rules拷贝到/etc/udev/rules.d/下。解释一下,该*.rules文件是一系列设备描述和权限配置的文件。官方已经给配好调试器的权限。只需要把这个文件放进udev的rules.d目录下,令其生效即可。有些时候,需要把调试器重新插上去,按照新规则进行挂载。

Error: JTAG scan chain interrogation failed: all ones

错误信息如下

[XXX@XXX ~]$ openocd -f interface/jlink.cfg -f target/stm32f1x.cfg
Open On-Chip Debugger 0.10.0
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "jtag". To override use 'transport select '.
adapter speed: 1000 kHz
adapter_nsrst_delay: 100
jtag_ntrst_delay: 100
none separate
cortex_m reset_config sysresetreq
Info : No device selected, using first device.
Info : J-Link ARM V8 compiled Nov 28 2014 13:44:46
Info : Hardware version: 8.00
Info : VTarget = 3.313 V
Info : clock speed 1000 kHz
Error: JTAG scan chain interrogation failed: all ones
Error: Check JTAG interface, timings, target power, etc.
Error: Trying to use configured scan chain anyway...
Error: stm32f1x.cpu: IR capture error; saw 0x0f not 0x01
Warn : Bypassing JTAG setup events due to errors
Error: Invalid ACK (7) in DAP response
Error: JTAG-DP STICKY ERROR
Error: Invalid ACK (7) in DAP response
Error: JTAG-DP STICKY ERROR

原因可能是多方面的,但是注意看提示。Error: JTAG scan chain interrogation failed: all ones。这个意思是,当前使用jtag进行扫描,没有发现任何一个符合的目标。

解决方法:

  1. 连接的设备平台是不支持jtag的,请检查自己设备的设置,是否使用的jtag的transport协议。
    解决方法很简单。openocd命令在没有指定的情况下默认会选择jtag协议。如果自己的设备使用了swd协议。需要单独指定。cp一份openocd的interface/XX.cfg文件,比如我使用的是j-link,我cp一份jlink.cfg并命名为jlnk-swd.cfg,文本内容如下

    interface jlink
    transport select swd

注:openocd支持的transport可以使用命令查看
openocd -c 'transport list'

  1. 检查自己引出的调试线是否有故障。链接牢固与否
  2. 调试器自身的故障 (补充:2018/11/23 )
    可能这就是脸黑吧。jlink进行jtag调试没问题。我遇到的故障原因在于jlink固件掉了。刷固件修复以后,使用jtag也是没有问题的,这个也可以作为故障查找的方向吧

关于PlatformIO IDE使用openocd调试的一些补充内容

  1. platformio使用openocd进行调试需要先在platfromio.ini中进行相关的设置

; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:genericSTM32F103C8]
platform = ststm32
board = genericSTM32F103C8
framework = stm32cube
upload_protocol = jlink
debug_tool = jlink
debug_port = localhost:3333

参考资料:https://docs.platformio.org/en/latest/projectconf.html

  1. platformio使用的openocd,在linux上是自动下载的gnuarmeclipse-openocd。存放在
    /home/XX/.platformio/packages/tool-openocd/
  2. platformio使用openocd进行对应芯片调试的时候,会自行设置使用的transport

启用Trace Debug实现处理器全速运行下的调试

在调试程序时,有些bug是无法简单地使用调试器强行打断CPU的运行找出。
全速运行时出现bug,使用调试软件对其进行交互式调试时,bug又不见了,如此反复。甚是折腾。

跟踪调试机制正是为了解决这个问题。

在ARM中典型的是ITM,如下给出openocd连接STM32,使用ITM进行调试的示例


2019年2月28日
// 注,代码的实现思路正在研究中,近期更新具体的实现方法


参考资料:https://github.com/PetteriAimonen/STM32_Trace_Example

参考内容

官方说明文档:http://openocd.org/doc-release/pdf/openocd.pdf

你可能感兴趣的:(软件问题解决)