mcu trace扫盲篇
ref:
一、背景
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.
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、Trace Link
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:
三、常用工具汇总
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-Trace
https://kb.segger.com/J-Tracehttps://www.bilibili.com/video/BV1vPqzYPEQb/?vd_source=a511b8a2b7a947eb836b363cbfa14681
https://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=a511b8a2b7a947eb836b363cbfa14681
https://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
【实战技能】 单步运行源码分析,一期视频整明白FreeRTOS内核源码框架和运行机制,RTOS Trace链表功能展示_哔哩哔哩_bilibili
【硬件异常黑盒子功能】成功使用LUA小程序实现类似MDK的硬件检测机制,并且更进一步锁异常位置,支持脱机运行 - 硬汉嵌入式 - 博客园
更多推荐



所有评论(0)