OpenOCD介绍
什么是OpenOCD
OpenOCD(Open On-Chip Debugger)是一个开源的片上调试器,旨在提供针对嵌入式设备的调试、系统编程和边界扫描功能。
OpenOCD的功能需要调试仿真器来辅助完成,调试仿真器是一个提供调试目标电信号的小型硬件单元。常用的有JLink、STLink等,一些开发板直接集成了调试仿真器,如小熊派开发板就集成了STLink。
通过下面的OpenOCD架构图我们能更好的认识OpenOCD。可以看出OpenOCD提供了GDB Server,可以通过它进行GDB相关的调试操作。提供Telnet Server,可以通过Telnet连接对目标板进行烧录、重启等操作。OpenOCD的配置基于TCL脚本,可以使用默认自带的TCL脚本,也可以编写自定义的脚本。
如何使用
上面我们提到OpenOCD需要调试仿真器配合使用,一般我们还会使用gdb client与其配合进行远程调试。
具体命令行操作步骤如下:
启动OpenOCD(以小熊派开发板为例)
openocd –f board\stm32l4discovery.cfg
-f 参数指定加载的TCL脚本文件,可以在OpenOCD 的scripts目录下找到很多自带的脚本。具体值根据不同开发板指定。启动gdb客户端并连接
arm-none-eabi-gdb
启动gdb客户端
target remote :3333
连接到gdb server(OpenOCD默认为3333端口)
接下来就可以使用gdb命令进行开发板的调试了。
相关概念
JTAG
JTAG(Joint Test Action Group,联合测试行动小组)是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试。现在多数的高级器件都支持JTAG协议,如ARM、DSP、FPGA器件等。标准的JTAG接口是4线:TMS、 TCK、TDI、TDO,分别为模式选择、时钟、数据输入和数据输出线。 相关JTAG引脚的定义为:
TMS:测试模式选择,TMS用来设置JTAG接口处于某种特定的测试模式;
TCK:测试时钟输入;
TDI:测试数据输入,数据通过TDI引脚输入JTAG接口;
TDO:测试数据输出,数据通过TDO引 脚从JTAG接口输出;
SWD
串行调试(Serial Wire Debug),一种和JTAG不同的调试模式,与JTAG的20个引脚相比,SWD只需要4个(或者5个)引脚,结构简单,但是使用范围没有JTAG广泛,主流调试器上也是后来才加的SWD调试模式。
SWD和传统的调试方式区别:
SWD模式比JTAG在高速模式下面更加可靠。在大数据量的情况下面JTAG下载程序会失败,但是SWD发生的几率会小很多。基本使用JTAG仿真模式的情况下是可以直接使用SWD模式的,只要你的仿真器支持,所以推荐大家使用这个模式。
在GPIO刚好缺一个的时候,可以使用SWD仿真,这种模式支持更少的引脚。
在板子的体积有限的时候推荐使用SWD模式,它需要的引脚少。
OpenOCD资料
项目主页 http://openocd.org/
用户手册 http://openocd.org/doc/html/index.html
源码镜像 https://github.com/ntfreak/openocd
OpenOCD通常都是源码发布,当然网上有一些编译好的二进制分发,例如这个 https://gnutoolchains.com/arm-eabi/openocd/