作者:Terry Ni,AMD工程师;来源:AMD开发者社区
一、引言
在嵌入式系统调试工具中, trace工具通常是解决一些疑难问题的最好工具。它能够在不破坏和修改原有运行过程的情况下,直接抓取到执行过程。这对调查一些异常挂起,异常状态或是特殊工况提供了非常好的抓手。
在我们zynqMP或者Versal的PS部分集成有ARM CoreSight模块,这个模块就是用来实现我们trace功能的核心。其结构如下图所示:

二、安装OpenCSD
ARM Coresight抓trace是遵循"Arm® Embedded Trace Macrocell Architecture Specification"规范,其解析一般是需要配合ARM DS开发套件来使用。但是为了使coresight具有更大的开放度,ARM推出了openCSD。用户可以使用这个开源库来解析trace文件。
1)下载openCSD源文件
从git链接中下载openCSD源码 https://github.com/Linaro/OpenCSD/tree/master
2)编译openCSD库
进入到源码的OpenCSD/decoder/build/linux/目录下,用make install将其编译,并安装到用户指定的路径下。例如:
make install PREFIX="/my_app/openCSD"
3)把OpenCSD安装路径设置到系统中,例如:
export OPENCSD_PATH=“/my_app/openCSD”
4)在Vitis工具中使能PS trace
点击Vitis菜单,选择New Featrue Preview

选择PS Trace,并点击“Enable”

三、PS trace的使用方法
1)在Vitis Debug环境下使用
在debug配置界面中,使能trace功能,并设置trace内存保存地址,大小以及输出文件的路径位置。

当你进入debug调试界面之后,你可以右击标记栏,添加trace的起始中断位置,以及结束中断位置。



当你通过debug工具(全速执行,单步等)完成程序运行后,trace文件也会相应的生成完毕。

接着,可以通过Vitis菜单下PS trace->Open PS Trace工具来直观的追踪刚刚记录下来的trace文件。



2)在外部XSCT环境下使用
通常在实际应用过程中,通过trace功能是为了捕捉一些异常板上出现的异常情况,在这种情况下,并不能借助Vitis debug环境来复现,并且有些情况下,不清楚异常错误的位置,也可能APU已经crash。这个时候我们可以通过XSCT的方式来使用trace功能。
首先,在XSCT中加载trace相关的指令函数。

不同的device器件需要加载的tcl脚本不一样,具体可以在Vitis/2024.2/scripts/vitis/util/目录下查看。

接下来,还是通过XSCT工具,下载你的elf程序,或者通过stop指令将已经运行的程序暂停。

当程序进入暂停状态后,你用enable_trace <core name> <buffer address> <buffer size> 命令启动ps trace
例如:

接着,你可以通过bpadd命令,在程序中的某个执行地址上设置一个断点,或者等到程序异常停止后,或者随时用stop指令暂停程序与运行。程序处于暂停或者crash状态后,就可以通过write_trace_output <core name> <buffer address> <buffer size> <output path>命令来获取trace文件。
例如:

最后,你可以通过Vitis菜单下PS Trace -> Generate PS Trace工具来生成解析后的trace文件。例如:trace_file.decode.txt



总结:
PS trace工具是嵌入式调试过程中的一项大杀器,对于偶发性异常问题的排查可以起到关键性的作用。利用Vitis工具中的ps trace,可以在实际应用过程中更加高效的排查问题,减少成本,提高效率。