使用openocd,可以适配大批的调试器,真正做到一个软件驱动所有。但是现阶段的使用,如果没有仔细阅读官方的使用说明,或者对自己用的芯片不熟悉,会产生大量的问题。
最好的办法是先阅读一遍openocd官方的文档,有了一定的基础以后,再结合自己所用的芯片进行调整。
一条原则:出了问题,不要完全归结于官方给出的Script有问题。主动去检查错误发生的根本原因
基本上只出现在linux上,windows是不会有这个的
这个很明显是权限问题。也就是openocd没有权限看到、操作调试器。
解决方法(两种):
openocd -f interface/xxx.cfg -f target/xxx.cfg
openocd/contrib
,linux:/usr/share/openocd/contrib
,将dd-openocd.rules
拷贝到/etc/udev/rules.d/
下。解释一下,该*.rules
文件是一系列设备描述和权限配置的文件。官方已经给配好调试器的权限。只需要把这个文件放进udev的rules.d目录下,令其生效即可。有些时候,需要把调试器重新插上去,按照新规则进行挂载。错误信息如下
[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进行扫描,没有发现任何一个符合的目标。
解决方法:
interface jlink
transport select swd
注:openocd支持的transport可以使用命令查看
openocd -c 'transport list'
; 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
/home/XX/.platformio/packages/tool-openocd/
在调试程序时,有些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