一、背景

1.1、什么是trace?

trace的是捕获相关数据的过程。简单点说就是记录cpu所执行的指令,数据的变化等等。

ARM 架构采用的跟踪方案,通常会针对每种类型的跟踪操作,配备一个独立的跟踪数据生成组件。例如,不同的跟踪源会分别生成处理器跟踪数据和总线跟踪数据。

1.2、trace分类

  • Instruction trace(指令跟踪):通常是ETM或者PTM支持

  • Data trace(数据跟踪):ETM模块支持
  • Instrumentation trace:ITM支持,用来捕获事件数据(例如:Data Watchpoint and Trace unit, DWT)或者软件主动记录的数据。通常通过swo接口输出。
  • System trace:和Instrumentation trace有点类似。ARM 架构的设计方案中,采用系统跟踪宏单元(STM) 来捕获系统跟踪数据。该模块包含两种型号,分别为 STM 与 STM-500。

1.2、trace有什么用?

可辅助分析程序的历史与动态行为,尤其适用于两类场景:一是指令未按顺序执行的情况(如中断、任务切换),二是与时序相关的事件(如仅在全速运行时才会出现的问题)

代码覆盖率分析是找出程序运行时未被执行的函数或指令(这类内容通常未经测试),该方法常用于完善测试用例。

代码执行频率分析:记录程序运行时各函数或指令的执行次数,以此找出占用 CPU 时间较长、需要重点优化的代码段。

二、基础知识

2.1、trace的总体框架

trace总体框架可以划分为三个部分:

  • Trace Source: 产生trace数据源的模块,例如 ETM(Embedded Trace Macrocell), ITM(Instrumentation Trace Macrocell)

  • Trace Sink: trace输出端:
    暂存trace数据的模块:Embedded Trace Buffer (ETB), Embedded Trace FIFO (ETF);
    trace数据的输出模块:Trace Port Interface Unit (TPIU), Serial Wire Output (SWO)

  • Trace Link: A component which links trace or non-trace components together; for example: Funnel, Replicator, Cross Trigger Interface (CTI).

ref:

https://documentation.infineon.com/psoc6/docs/kof1667492125780

2.2、Trace Source

arm设计的trace source其实有很多,这里我们只针对常用的ETM和ITM展开。其他的几种source见逛网介绍:https://developer.arm.com/documentation/102119/0200/Trace-components

2.2.1、ETM

嵌入式跟踪宏单元(ETM)组件支持指令跟踪与数据跟踪(可选)功能。

ETM data trace capability is an optional feature in the ETM architecture. ETMv4 does not support data trace on Armv8 or Armv7 processors.

从宏观层面来看,ETM 并不会为中央处理器(CPU)执行的每条指令都生成跟踪数据包。它仅输出指令流相关信息(跳转或未跳转),并在部分场景下(如遇到分支指令时)输出完整的目标地址。调试主机通常会存有应用程序镜像的副本,因此借助 ETM 组件提供的数据,即可重建程序的完整执行过程。由于 CPU 运行速度通常较快,ETM 模块需要先对指令执行数据进行压缩并封装成数据包,再将其发送至跟踪接收器。

ETM 数据还包含时间戳,可用于判定代码或函数的耗时情况。函数性能分析在优化代码中占用大量 CPU 带宽的区域时,能发挥重要作用。

ps:在Armv8前,还有一个PTM专门跟踪指令流。

Program Trace Macrocell (PTM) is only found in systems before Armv8. PTMs perform instruction trace only.

https://developer.arm.com/documentation/102119/0200/Trace-components/Program-Trace-Macrocell-Trace-source

2.2.2、ITM

指令跟踪宏单元(ITM)是一种由应用程序驱动的跟踪源。ITM 的数据可来源于多个渠道。

软件源 —— 应用程序可直接写入 ITM 寄存器。一个典型用例是发送原始模数转换器(ADC)数据,这些数据可在调试主机上进行绘图和可视化展示。

硬件源 —— DWT模块具备数据观察点、数据跟踪、调试事件及性能分析计数器等功能。这些调试系统产生的数据可通过 ITM 进行传输。

时间戳 ——ITM 内部的计数器可为每个跟踪数据包提供时间戳。

2.3、Trace Sink

2.3.1、Embedded Trace Buffer (ETB)

ETB是一块专用SRAM,可在芯片上存储生成的跟踪数据,供后续读取和分析使用。该静态随机存取存储器(SRAM)采用循环缓冲区工作模式,当达到缓冲区容量上限时,会自动进行循环覆盖。

2.3.2、Embedded Trace FIFO (ETF)

ETF是一块专用的SRAM,该存储器可配置为循环缓冲区、硬件FIFO或软件FIFO三种工作模式

在循环缓冲区模式下,ETF的功能与ETB完全一致;

在硬件FIFO下,ETF通常用于平滑跟踪数据的波动。

在软件FIFO下,片上软件可以通过可通过ETF调试高级微控制器总线架构(AMBA)外设总线(APB)接口读取ETF内的数据。

2.3.3、Trace Port Interface Unit (TPIU)

跟踪端口接口单元(TPIU)负责将跟踪数据传输至外部引脚。调试器可连接这些外部引脚以捕获跟踪数据。该单元还会在跟踪数据流中添加源标识信息,从而使跟踪数据能够与其对应的跟踪源重新关联。

跟踪端口接口单元(TPIU)通常对应 4 个数据引脚和 1 个时钟引脚。

2.3.4、Serial Wire Output (SWO)

单引脚的串行线输出(SWO)并不适合输出嵌入式跟踪宏单元(ETM)的跟踪数据,它主要用于传输指令跟踪宏单元(ITM)的数据。

2.4.1、Funnel

将多个ATB总线的数据汇总到一个ATB总线。Then the single ATB can be routed to a trace sink, replicator, or another trace funnel.

AMBA Trace Bus (ATB – bus that carries data from trace sources)

2.4.2、Replicator

将一条ATB总线的数据拆分至多条

2.4.3、Cross Trigger Network (CTI)

交叉触发接口 用于在不同的跟踪组件之间生成并传递触发信号。例如,当缓冲区存满时,ETB 可向 ETM 模块发送触发信号,使中央处理器(CPU)暂停运行。

2.5、Trace output

跟踪数据对带宽要求较高,因此在转换为数据包前需进行压缩 / 编码,这使得跟踪数据并非直接可读的格式;调试器捕获这类数据后,会通过解压缩 / 解码与处理将其转换为人类可读的形式。不过有时通过 ITM 传输原始数据时,跟踪数据包也可直接包含未编码的原始数据。

跟踪数据生成后的处理方式,取决于你的调试环境与目标设备的性能。多数外部调试环境会将跟踪数据导入调试器进行分析,此时跟踪数据会通过片上捕获或片外捕获的方式,存储在目标设备中或从设备导出。

On-chip capture

trace数据暂存在chip内部的内存。需要的时候在通过调试接口(一般是swd或者jtag)传输到调试器或者pc进行分析。

Off-chip capture

trace实时地传输到外部调试器。通常通过TPIU或者swo接口。

ref:

https://developer.arm.com/documentation/102119/0200/Trace-outputhttps://developer.arm.com/documentation/102119/0200/Trace-output

三、常用工具汇总

1、劳特巴赫的power debug/trace调试器 + power view(trace32)软件

https://cn.lauterbach.com/https://cn.lauterbach.com/

2、segger公司的jlink/jtrace系列调试器 + ozone软件

https://kb.segger.com/J-Tracehttps://kb.segger.com/J-Tracehttps://www.bilibili.com/video/BV1vPqzYPEQb/?vd_source=a511b8a2b7a947eb836b363cbfa14681https://www.bilibili.com/video/BV1vPqzYPEQb/?vd_source=a511b8a2b7a947eb836b363cbfa14681

3、国产sptrace

https://std.plus/https://std.plus/

4、segger公司的systeview

RTT缓存+swd接口

https://www.bilibili.com/video/BV13x5ezeE3N/?spm_id_from=333.1391.0.0&vd_source=a511b8a2b7a947eb836b363cbfa14681https://www.bilibili.com/video/BV13x5ezeE3N/?spm_id_from=333.1391.0.0&vd_source=a511b8a2b7a947eb836b363cbfa14681https://www.segger.com/downloads/systemview/https://www.segger.com/downloads/systemview/

5、rt-thread出的RT-Trace

这是一款专为嵌入式开发者打造的高性能调试工具。它支持 SWD/JTAG 高速连接,搭载了板载显示屏离线交互系统与 Web UI 实时监控平台。可通过 Web UI 实时可视化展示线程切换关系,精准呈现各线程运行时间和 CPU 负载,还能通过多通道实时追踪数据,并以可自定义布局的图表呈现。目前已支持 Cortex-M3/M4/M7 系列芯片调试,未来计划支持 Cortex-M0、Cortex-A 等更多芯片系列。

6、H7-TOOL 的 RTOS Trace 功能

从 H7-TOOL 的 2.20 版本固件开始支持该功能。它采用 LUA 小程序,无需用户编写代码,可直接生成使用。其特色在于无需目标板额外编写代码,仅需通过 SWD 接口连接目标板,就能实时检测 RTX5、ThreadX、uCOS-III 等多种 RTOS(实时操作系统),还支持 WiFi、以太网和 USB 连接,可外网远程访问。此外,它支持 RTOS Trace 链表功能,能帮助用户了解内核链表框架。

ref:

https://developer.arm.com/documentation/102119/latest/

https://rsaxvc.net/blog/2024/2/27/Lauterbach_Teardowns.html

https://newandroidbook.com/tools/jtrace.html

【原创】H7-TOOL的RTOS Trace操作说明,不需要目标板额外做任何代码,实时检测RTOS任务执行情况,支持在线和脱机玩法2025-03-22 - H7-TOOL开发工具 - 硬汉嵌入式论坛 - Powered by Discuz!

https://github.com/armfly

【实战技能】 单步运行源码分析,一期视频整明白FreeRTOS内核源码框架和运行机制,RTOS Trace链表功能展示_哔哩哔哩_bilibili

STM32H7视频教程第6期:MDK专题进阶,Cortex-M内核芯片Hardfault硬件异常调试分析定位(2022-02-17) - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz!

【硬件异常黑盒子功能】成功使用LUA小程序实现类似MDK的硬件检测机制,并且更进一步锁异常位置,支持脱机运行 - 硬汉嵌入式 - 博客园

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐