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 <transport>'.
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章