有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本文目录- 2. 安装
- 2.1. Linux 系统
- 2.2. Windows 系统
- 3. 运行
- 3.1. 简单的启动(非用户自定义)
- 3.2. OpenOCD 在启动时做了些什么
- 4. 附录1: OpenOCD当前支持的仿真器硬件
- 4.1. 加密狗
- 4.2. 独立的JTAG探测器
- 4.3. 基于 USB FT2232
- 4.4. USB-JTAG/Altera USB-Blaster 兼容机
- 4.5. 基于 USB J-Link
- 4.6. 基于 USB RLINK
- 4.7. 基于 USB ST-LINK
- 4.8. 基于 USB TI/Stellaris ICDI
- 4.9. 基于 USB CMSIS-DAP
- 4.10. 其它 USB 仿真器
- 4.11. 基于IBM PC并行打印口
1. 前言
当今开发环境中,嵌入式工程师都会十分熟悉自己项目用到的调试器和调试软件,但是你真的清楚
- 所谓的JTAG、SWD是什么?
- 调试器又是怎样工作的?
- 为什么每一个厂家甚至每一款芯片都需要用到不同的调试器,大家都使用JTAG协议,用一款调试器不好嘛?
- CMSIS-DAP 又是什么鬼,和JTAG有什么不同么?
如果你真的清楚如上几个问题,那我相信,OpenOCD你一定听说过,并且很可能已经使用过,如果你并不了解如上几个问题,想你你在读完本文后,会找到满意的答案。
本文OpenOCD技术部分讲解大部分根据 OpenOCD User’s Guide 翻译所得,增加了自己的理解和一些演示的案例,如果英文能力好的同学可以直接阅读原文,笔者能力有限,如有问题欢迎各位侠士随时指正!
1.1. 什么是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支持调试和边界扫描。
还有SWD仿真器,这种仿真器支持使用SWD(Serial Wire Debug)信号与一些比较新的ARM芯片进行通讯,而且还可以作为那些同时支持JTAG和SWD的芯片的仿真器。不过SWD仅支持调试,不支持边检扫描。
对于一些芯片,还有专门的编程下载器,这些下载器仅支持擦写FLASH的功能,不支持调试和边界扫描。对于此类专用下载器,OpenOCD暂时并不支持。
加密狗:OpenOCD目前支持多种类型的硬件加密狗:基于USB的,基于并行端口的,以及其他在内部运行OpenOCD的独立盒子。 请参见第2章[仿真器硬件],第5页。
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等)的初步支持。
2. 安装
2.1. Linux 系统
- 到OpenOCD下载官网最新软件,本文撰写时最新软件版本为0.10.0。OpenOCD:https://sourceforge.net/projects/openocd/
- 解压后,进入openocd-0.10.0目录,右键在终端中打开,tomato@tomato-PC:~/Software/openocd-0.10.0$
- 英文好的同学可以直接点开INSTALL这个文件,根据指导一步步安装,英文不好的童靴可以继续往下看后面几步
- 运行 $ ./configure 命令,进行OpenOCD配置,可配置的项目可以通过 $ ./configure -h 命令查看帮助信息。 笔者的调试器是J-Link,所以还要运行如下命令进行使能 $ ./configure --enable-jlink
- 此处注意,由于笔者使用的是deepin系统,基于Debian,使能jlink的时候系统提示configure: error: libusb-1.x or libjaylink-0.1 is required for the SEGGER J-Link Programmer,笔者选择安装libusb-1.x这个组件,使用如下命令进行安装 $ sudo apt-get install libusb-1.0.0-dev。
- 此处注意,OpenOCD可以使用gcc和clang两个编译器进行编译,但是笔者的系统默认编译器为 gcc 7.2,在编译过程中会由于报出warning而终止,到网上查了一下发现是OpenOCD的bug,后面有修改。为了保证当前顺利安装,笔者选择忽略warning,继续编译。运行 $ ./configure --disable-werror命令进行不把warning变成error的配置,并会生成相应的makefile。然后运行$ make 进行编译。
- 运行 $ sudo make install 进行软件安装
- 安装完成后,运行 $ openocd -V 命令,查看当前软件版本。我安装的环境当前会返回 Open On-Chip Debugger 0.10.0字样。
如果后续想要卸载OpenOCD,可以到OpenOCD的目录下,使用 $ make uninstall 进行卸载。
2.2. Windows 系统
TBD
3. 运行
安装好OpenOCD后,需要根据你的操作系统,设置访问debug适配器的权限。
在Linux系统上,通常涉及/etc/udev/rules.d文件夹的操作。
OpenOCD会附带一个通用规则文件60-openocd.rules,在OpenOCD解压后文件夹的contrib 目录中。
按照文件中d的说明提示进行操作,OpenOCD 0.10.0版本的文件提示为 # Copy this file to /etc/udev/rules.d/ 。
Windows系统需要针对每一个不同的外设,适配复杂的驱动配置。本文没有对此进行详细说明。
然后,可以通过不同选项来调用OpenOCD的服务。 --help选项会出现如下提示:
bash$ openocd --help
Open On-Chip Debugger 0.10.0
Licensed under GNU GPL v2For bug reports, read
http://openocd.org/doc/doxygen/bugs.htmlOpen
On-Chip DebuggerLicensed under GNU GPL v2
--help | -h display this help
--version | -v display OpenOCD version
--file | -f use configuration file <name>
--search | -s dir to search for config files and scripts
--debug | -d set debug level <0-3>
--log_output | -l redirect log output to file <name>
--command | -c run <command>
如果没有输入 -f 或 -c 的选项命令,OpenOCD会试图读取openocd.cfg这个配置文件。
如果定义了不同的配置文件,需要使用-f命令。示例如下: openocd -f config1.cfg -f config2.cfg -f config3.cfg
配置文件和脚本按照如下目录进行顺序搜索:
- 当前工作目录
- 命令选项-s后面跟随的目录地址
- 使用 add_script_search_dir 命令定义的目录地址
- $HOME/.openocd(非Windows)
- OPENOCD_SCRIPTS环境变量设置
- $pkgdatadir/site站点中的脚本
- $pkgdatadir/scriptsOpenOCD支持的脚本库
需注意: 配置脚本的名字和路径中,不能包含 # 这个特殊字符,该字符为Tcl命令的起始标志。
3.1. 简单的启动(非用户自定义)
好的情况下,仅用两个库里自带的脚本就可以启动服务并连接JTAG适配器,达到开箱即用的效果。 不过服用这些脚本虽然能够帮助你启动功能,距离功能完善还是需要进行一些自定义配置。 这些可以参考 [OpenOCD Project Setup] 这一章。
如果找到了适用于 JTAG适配器或目标板子的脚本,可以通过如下几条命令连接上JTAG适配器,并启动调试功能。
openocd -f interface/ADAPTER.cfg -f board/MYBOARD.cfg
openocd -f interface/ftdi/ADAPTER.cfg -f board/MYBOARD.cfg
如果要进行复位信号的配置,可以使用 -c 'rreset_configtrst_and_srsteset_config'命令。
如果一切正常,将会看到如下类似的反馈信息。
Info : JTAG tap: lm3s.cpu tap/device found: 0x3ba00477
(mfg: 0x23b, part: 0xba00, ver: 0x3)
如果看到了 “ap/device found” 反馈字样,并且没有 warning信息,则证明JTAG通讯已经建立。 这是一个里程碑步骤,为了达到这一步还可能进行更多的项目设置。
3.2. OpenOCD 在启动时做了些什么
OpenOCD首先处理命令行上提供的配置命令,如果没有 -c 或 -f 的命令,OpenOCD会处理名为 openocd.cfg 文件中的命令。 可以查看[Configuration Stage]章节的介绍。在配置阶段最后,OpenOCD会使用配置好的命令参数验证JTAG扫描链,所以要确保配置正确。
通常OpenOCD会作为server一直运行。OpenOCD的命令也可以作为提前终止配置阶段,执行其它工作(如烧写flash),此时不会作为server一直运行,工作任务结束后会自动关闭。
|