JTAG因为文章内容比较多,拆分成了四个部分,读者可以根据需求,点击查看其它的JTAG信息:

JTAG基础

JTAG调试原理

JTAG调试实例

模拟系统崩溃,使用JTAG调试找到崩溃点

JTAG调试实例

本文以DM8168芯片为例,使用XDS560仿真器,对JTAG进行调试。

连接仿真器,查看仿真器类型。

通过设备管理器可以查看当前连接的仿真器类型和型号,方面后续调试时选择正确的仿真器型号。(根据自己实际使用的仿真器型号去选择)

RISCV JTAG 需要 address map jtag id code specified_linux

打开CCS5/CCS7软件(没有可以自行安装)

RISCV JTAG 需要 address map jtag id code specified_linux_02

新建/选择项目目录

这里不是重点,随便新建一个目录都可以。

RISCV JTAG 需要 address map jtag id code specified_linux_03

“view”->“Target Configurations”

这里就是为了选择仿真器类型+需要仿真的芯片类型。(仿真器类型看设备管理器,芯片类型看对应的芯片型号)

RISCV JTAG 需要 address map jtag id code specified_JTAG_04

“Target Configurations” -> “User Defined” -> "NewTargetConfiguration.ccxml"

这里选择对应的配置文件,可以自己新建.ccxml配置文件。

RISCV JTAG 需要 address map jtag id code specified_嵌入式_05

“NewTargetConfiguration.ccxml” -> "Connection" -> "Board or Device" -> “Save Configration” -> "Test Configration"

双击上一步的.ccxml配置文件,进入到配置界面,然后选择对应的仿真器类型和芯片类型(仿真器类型看设备管理器,芯片类型看对应的芯片型号)

选择结束后需要点击“Save Configration”保存本次配置,然后点击“Test Configration”测试一下仿真器能否正常连接设备。

(注:在"Test Configration"这一步可能会出很多很多的问题,每个问题都需要单独分析)

有关的JTAG连接问题,参考:

https://software-dl.ti.com/ccs/esd/documents/ccsv7_debugging_jtag_connectivity_issues.html

RISCV JTAG 需要 address map jtag id code specified_linux_06

“Test Configration”测试JTAG连接成功打印如下:

RISCV JTAG 需要 address map jtag id code specified_linux_07

“Target Configurations” -> “User Defined” -> "NewTargetConfiguration.ccxml" ->(右键) "Launch Selected Configuration"

确认JTAG连接功能正常后,回到之前的“Target Configurations”界面(如果找不到了,重新按4、5步去做就能找到了)

在"NewTargetConfiguration.ccxml"界面通过鼠标右键,打开"Launch Selected Configuration"选项,进入到JTAG调试

RISCV JTAG 需要 address map jtag id code specified_嵌入式_08

"Launch Selected Configuration" -> "Debug" -> "xxx Debug Probe xxx" -> "Connect Target"

Launch之后,就可以开始Debug调试了,选择对应的芯片,点击鼠标右键,通过“Connect Target”连接,

连接成功后,芯片末尾()中会变成Suspended/Connect...之类,

后面就可以开始读取对应的芯片寄存器了。

RISCV JTAG 需要 address map jtag id code specified_开发工具_09

“Suspended” -> "view" -> "Memory..." / "Registers" / "Disassembly"...

连接上芯片后,可以调试/查看的信息有下面的几个

      "Memory..." - 输入内存地址,打印对应内存地址上的值;

“Registers” - 直接查看Core寄存器中的PC、LR、R0~R15等寄存器,判断当前系统运行在哪个函数上(需要我们将程序反汇编,再根据PC/LR中的值,找到该地址对应的函数)

“Disassembly” - 对应汇编指令(其实将运行的镜像反汇编后,找到对应地址,看到的也是在执行这段命令)

RISCV JTAG 需要 address map jtag id code specified_开发工具_10