【芯片调试】OpenOCD是什么?
时间:2023-12-11 22:35来源: Hcoco TrustZone 作者:ictest8_edit 点击:
次
前言
最近在调试一些单板,对于这个调试工具我真的是又爱又恨,熟悉了那就是金箍棒,不熟悉那就是拦路虎。
有的东西用了很久还不知道这个玩意是干嘛的,于是这里来整理一篇来学习一下。
调试的工具针对不同的领域当然有很多的,这里涉及到的工具是OpenOCD,这个玩意我们一起来学习一下相应的使用方式。
一、OpenOCD是什么?
我们在使用的时候会用到OpenJTAG,那么先来看看OPENJTAG是什么?
1-OPENJTAG是什么?
OpenJTag是一个开源项目(包含软件和硬件)。
硬件是一个USB接口转JTag接口的适配器。
借助开源软件OpenOCD可以完成程序的烧写,调试等任务OpenJTag的功能:
1. 往Flash烧写程序:支持NOR Flash 和 NAND Flash
2. 支持Windows以及Linux
3. 能够用在支持GDB调试协议的工具上:如IAR, Eclipse
4 USB转串口功能
所以本质上还是开源软件OpenOCD
2-J-Link、J-Trace、Open JTAG区别
J-Link、J-Trace、Open JTAG都是用来调试程序的(当然还有其他工具可以进行调试,比如ICE),J-Link和J-Trace是SEGGER公司的(http://www.segger.com)。Open JTAG(http://www.openjtag.org/)是 一个开源项目,其目标是使嵌入式开发者能够通过JTAG接口,用开放的硬件和软件系统进行烧写、校验和调试[1]。他们都基于JTAG调试接口协议。
本质上都是基于JTAG接口协议的。
3-OpenOCD是什么
OpenOCD(Open On-Chip Debugger)开源片上调试器,是一款开源软件,最初是由Dominic Rath同学还在大学期间发起的(2005年)项目。OpenOCD旨在提供针对嵌入式设备的调试、系统编程和边界扫描功能。
OpenOCD的功能是在仿真器的辅助下完成的,仿真器是能够提供调试目标的电信号的小型硬件单元。仿真器是必须的,因为调试主机(运行OpenOCD的主机)通常不具备这种电信号的直接解析功能。
仿真器支持一个或多个传输协议,每个协议涉及不同的电信号,且使用不同的协议栈进行消息传递。市面上有很多种仿真器,并且这些仿真器的命名没有统一的规律。
仿真器有时候会被封装成独立的加密狗,这种称为硬件接口加密狗。一些开发板上面直接集成了硬件接口加密狗,这样可以使开发板通过USB直接连到主机上进行调试。
例如,JTAG仿真器支持JTAG协议的信号,可以用来进行TAPs和目标板子之间符合JTAG协议(IEEE 1149.1)的通讯。TAP(Test Access Port)是处理特殊指令和数据的单元。TAPs在芯片与板子之间和之内以菊花链的形式进行连接。JTAG支持调试和边界扫描。
这里可以看一下之前的那篇【万文长字带你搞懂JTAG的门门道道】
还有SWD仿真器,这种仿真器支持使用SWD(Serial Wire Debug)信号与一些比较新的ARM芯片进行通讯,而且还可以作为那些同时支持JTAG和SWD的芯片的仿真器。不过SWD仅支持调试,不支持边检扫描。
对于一些芯片,还有专门的编程下载器,这些下载器仅支持擦写FLASH的功能,不支持调试和边界扫描。对于此类专用下载器,OpenOCD暂时并不支持。
· 加密狗:OpenOCD目前支持多种类型的硬件加密狗:基于USB的,基于并行端口的,以及其他在内部运行OpenOCD的独立盒子。
· GDB调试:它允许ARM7(ARM7TDMI和ARM720t),ARM9(ARM920T,ARM922T,ARM926EJ-S,ARM966E-S),XScale(PXA25x,IXP42x),Cortex-M3(Stellaris LM3,ST STM32和Energy Micro EFM32)和基于Intel Quark(x10xx)的内核使用GDB协议进行调试。
· Flash编程:擦写FLASH支持外部CFI兼容NOR闪存(Intel和AMD / Spansion命令集)和几个内部闪存(LPC1700,LPC1800,LPC2000,LPC4300,AT91SAM7,AT91SAM3U,STR7x,STR9x,LM3,STM32x和EFM32)。包括各种NAND闪存控制器(LPC3180,Orion,S3C24xx等)的初步支持。
· 小结一下:
OpenOCD (Open On-Chip Debugger)是一个开源的片上调试器,旨在提供针对嵌入式设备的调试、系统编程和边界扫描功能。
OpenOCD的功能需要调试仿真器来辅助完成,调试仿真器是一个提供调试目标电信号的小型硬件单元。常用的有Jink、STLink等,一些开发板直接集成了调试仿真器,如小熊派开发板就集成了STLink。
通过下面的OpenOCD架构图我们能更好的认识OpenOCD。
可以看出OpenOCD提供了GDBServer,可以通过它进行GDB相关的调试操作。
提供TeInet Server,可以通过Telnet连接对目标板进行烧录、重启等操作。
OpenOCD的配置基于TCL脚本,可以使用默认自带的TCL脚本,也可以编写自定义的脚本。
4-OpenJTAG怎么用?
上面我们提到OpenOCD需要调试仿真器配合使用,一般我们还会使用gdb client与其配合进行远程调试。
在这里插入图片描述
5-JTAG与SWD的区别
JTAG (Joint Test Action Group,联合测试行动小组)是一种国际标准测试协议(IEEE1149.1兼容),主要用于芯片内部测试。现在多数的高级器件都支持JTAG协议,如ARM、DSP、FPGA器件等。标准的JTAG接口是4线:TMS、TCK、TDI、TDO,分别为模式选择、时钟、数据输入和数据输出线。相关JTAG引脚的定义为:
· TMS:测试模式选择,TMS用来设置JTAG接口处于某种特定的测试模式;
· TCK:测试时钟输入;
· TDl:测试数据输入,数据通过TDI引|脚输入JTAG接口;
· TDO:测试数据输出,数据通过TDO引脚从JTAG接口输出;
串行调试(Serial Wire Debug),一种和JTAG不同的调试模式,与JTAG的20个引脚相比,SWD只需要4个(或者5个)引脚,结构简单,但是使用范围没有JTAG广泛,主流调试器上也是后来才加的SWD调试模式。
SWD和传统的调试方式区别:SWD模式比JTAG在高速模式下面更加可靠。在大数据量的情况下面JTAG下载程序会失败,但是SWD发生的几率会小很多。基本使用JTAG仿真模式的情况下是可以直接使用SWD模式的,只要你的仿真器支持,所以推荐大家使用这个模式。在GPIO刚好缺一个的时候,可以使用SWD仿真,这种模式支持更少的引脚。在板子的体积有限的时候推荐使用SWD模式,它需要的引脚少。
6-OpenOCD资料
· 项目主页 http://openocd.org/
· 用户手册 http://openocd.org/doc/html/index.html
· 源码镜像 https://github.com/ntfreak/openocd
· OpenOCD通常都是源码发布,当然网上有一些编译好的二进制分发,例如这个 https://gnutoolchains.com/arm-eabi/openocd/
· https://zhuanlan.zhihu.com/p/41517198
· https://bbs.huaweicloud.com/blogs/122621
但是内容肯定不止于此,不然我这个文章的意义在何处,通过上述的文字你应该对调试有了一定的认识。
我们都知道调试工具是依赖于OPENOCD的,但是这个OpenOCD是怎么用的,一般来说我们使用的都是集成了OpenOCD的带UI的工具,比如OpenJTAG的软件以及华为的HiWorkBench。
|
------分隔线----------------------------