Trace 功能用于跟踪记录cpu内部程序运行情况,进行实现代码覆盖率统计,CPU 负载分析,历史代码回溯,OS 调度分析等功能。其实现方式分为Off-Chip Trace 和On-Chip Trace 两种,Off-Chip Trace是指借助外部trace 工具连接目标控制器实现Trace 功能,On-Chip Trace 是指通过MCU 自身进行Trace功能的实现, 该方法的优点在于无需外接trace 设备即可实现Trace功能,便于调试的同时也节约了成本。那么是否所有的芯片都支持On-Chip Trace呢?显然并不是。On-Chip Trace的实现需要依赖于芯片本身的Emulation device (ED)功能,下面我们以AURIX™ TC39x ED为例来简单介绍一下其功能及具体使用方式。
AURIX™ TC39x Emulation Devices提供了与TC39x标准系列相同的功能集,并具有额外的调试和跟踪功能。TC39xXE支持校准、快速原型设计和调试/仿真。其具有的4 MB扩展内存(EMEM),其中2MB可用于校准和跟踪,支持Multi-Core Debug Solution (MCDS)多核调试方案,支持Aurora Gigabit Trace (AGBT) ,CPU可以完全访问所有仿真资源,使所有类型的接口(如以太网)都能作为工具连接。
AURIX 其余系列 Emulation Devices描述参考英飞凌官网的如下链接:
AURIX™ TC2xx Emulation Devices - Infineon Technologies
AURIX™ TC37x Emulation devices - Infineon Technologies
3. On-Chip Trace实战演示下面基于TC39x ED 型号的芯片演示On-Chip Trace 功能,调试器使用目前主流的Aurix调试器劳特巴赫, 397 上运行的操作系统采用车规级的CP Autosar OS。最终实现Task 调度分析,CPU 负载分析。
1) Trace 功能菜单介绍
Trace功能相关的菜单选项位于劳特巴赫主菜单的中间部分,各个下拉框的选项和含义如下图所示:
2)Trace功能的配置
Trace Configuration打开后的窗口如下图所示,如果使用OnChip Trace 功能,需要将METHOD 选为Onchip.
State 用于设置/显示 Trace 的状态,OFF是停止跟踪,ARM 是开始跟踪, Disable 是禁用, 若选中Disable ,则无法自动打开或者配置Trace 功能。
SZIE 用于设置/显示存储大小(若为EMEM ,则最大空间为2MB), Mode用于设置/显示Trace 数据的存储模式。
3)Trace MCDS 设置
MCDS 用于设置跟踪哪个CPU 的数据,以及跟踪哪些数据。时间戳的开启也是在这个页面设置。
4)ORTI文件导入
ORTI由Autosar OS 配置工具生成,本文中我们使用Vector 的davinci configurator进行生成,将该文件导入到劳特巴赫软件中可以用于解析OS 对应的符号表。导入Trace 后会多出一些如下图所示的跟OS Task 相关的功能选项。如采用命令行的方式导入,可采用如下命令:TASK.ORTI D:\ORTI_Path\Os_Trace.ORT
5)Task Switches断点的设置
设置Task 切换时的断点,将断点发生时的动作设置TraceEnable, 即可利用Trace 功能记录每次Task的切换。
6) Trace 数据的录取
通过点击Arm开始录取Trace 数据, used 里面的蓝色进度调显示实际的Trace 数据占用的存储空间,如需停止录取,可点击OFF.
7) CPU 负载和Task调度的查看
在Trace 数据录取完毕后,通过Perf 选项Task Runtime 可以查看CPU 负载和调度状态,并基于此来进行OS 性能的分析以及相关问题的排查
劳特巴赫CMM脚本的运用
可采用以下的脚本实现上述操作的自动化配置
print "initializing ORTI support..."
TASK.ORTI D:\ORTI_Path\Os_Trace.ORT
system.memAccess.CPU ; allow to access to other memory while running
SYstem.CpuAccess.Enable ; allow to access cpu memory while running
Targetsystem
PRINT "load complete."
PRINT TASK.CONFIG(magic)
MCDS.SOURCE.Set CpuMux0.Core TriCore0
MCDS.SOURCE.Set CpuMux1.Core TriCore2
Break.Set TASK.CONFIG(magic[0]) /Write /TraceEnable
Break.Set TASK.CONFIG(magic[2]) /Write /TraceEnable
MCDS.TimeStamp ON
CLOCK.ON
MCDS.SOURCE.Set CpuMux0.Program OFF
MCDS.SOURCE.Set CpuMux1.Program OFF
MCDS.SOURCE.Set CpuMux0.WriteAddr ON
MCDS.SOURCE.Set CpuMux0.WriteData ON
MCDS.SOURCE.Set CpuMux1.WriteAddr ON
MCDS.SOURCE.Set CpuMux1.WriteData ON
ENDDO(买电子元器件就上唯样商城)
TASK.ORTI D:\ORTI_Path\Os_Trace.ORT
system.memAccess.CPU ; allow to access to other memory while running
SYstem.CpuAccess.Enable ; allow to access cpu memory while running
Targetsystem
PRINT "load complete."
PRINT TASK.CONFIG(magic)
MCDS.SOURCE.Set CpuMux0.Core TriCore0
MCDS.SOURCE.Set CpuMux1.Core TriCore2
Break.Set TASK.CONFIG(magic[0]) /Write /TraceEnable
Break.Set TASK.CONFIG(magic[2]) /Write /TraceEnable
MCDS.TimeStamp ON
CLOCK.ON
MCDS.SOURCE.Set CpuMux0.Program OFF
MCDS.SOURCE.Set CpuMux1.Program OFF
MCDS.SOURCE.Set CpuMux0.WriteAddr ON
MCDS.SOURCE.Set CpuMux0.WriteData ON
MCDS.SOURCE.Set CpuMux1.WriteAddr ON
MCDS.SOURCE.Set CpuMux1.WriteData ON
ENDDO(买电子元器件就上唯样商城)