前言
使用openocd,可以適配大批的調試器,真正做到一個軟件驅動所有。但是現階段的使用,如果沒有仔細閱讀官方的使用說明,或者對自己用的芯片不熟悉,會產生大量的問題。
最好的辦法是先閱讀一遍openocd官方的文檔,有了一定的基礎以後,再結合自己所用的芯片進行調整。
一條原則:出了問題,不要完全歸結於官方給出的Script有問題。主動去檢查錯誤發生的根本原因
Permission Deny
基本上只出現在linux上,windows是不會有這個的
這個很明顯是權限問題。也就是openocd沒有權限看到、操作調試器。
解決方法(兩種):
- 使用root來執行
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目錄下,令其生效即可。有些時候,需要把調試器重新插上去,按照新規則進行掛載。
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進行掃描,沒有發現任何一個符合的目標。
解決方法:
- 連接的設備平臺是不支持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'
- 檢查自己引出的調試線是否有故障。鏈接牢固與否
- 調試器自身的故障 (補充:2018/11/23 )
可能這就是臉黑吧。jlink進行jtag調試沒問題。我遇到的故障原因在於jlink固件掉了。刷固件修復以後,使用jtag也是沒有問題的,這個也可以作爲故障查找的方向吧
關於PlatformIO IDE使用openocd調試的一些補充內容
- 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
- platformio使用的openocd,在linux上是自動下載的gnuarmeclipse-openocd。存放在
/home/XX/.platformio/packages/tool-openocd/
- platformio使用openocd進行對應芯片調試的時候,會自行設置使用的transport
啓用Trace Debug實現處理器全速運行下的調試
在調試程序時,有些bug是無法簡單地使用調試器強行打斷CPU的運行找出。
全速運行時出現bug,使用調試軟件對其進行交互式調試時,bug又不見了,如此反覆。甚是折騰。
跟蹤調試機制正是爲了解決這個問題。
在ARM中典型的是ITM,如下給出openocd連接STM32,使用ITM進行調試的示例
2019年2月28日
// 注,代碼的實現思路正在研究中,近期更新具體的實現方法
參考資料:https://github.com/PetteriAimonen/STM32_Trace_Example