#嵌入式分析 #异步

无需std utrace_macros

适用于嵌入式目标的基于仪器的性能分析库,支持异步操作

1个不稳定版本

0.1.1 2024年4月29日
0.1.0 2024年4月29日

#322 in 性能分析


2 crate中使用

MIT/Apache

35KB
564

utrace

utrace是一个基于仪器的嵌入式应用程序性能分析工具。它旨在跨平台、异步友好且低开销。utrace的操作原理受到了出色的defmt日志库的启发。

用法

主要的用户API是两个过程宏,可以用于插入仪器 - 属性#[trace]和函数式[trace_here]。可能的用法在此代码片段中展示

#[utrace::trace]
async fn do_something() {

}

#[utrace::trace]
fn do_something_else() {

}

{
    utrace::trace_here!();
    ...
    ...
}

#[trace]对异步函数进行仪器化时,将默认报告相应的未来创建、丢弃和轮询跨度的时间点。

当前实现假设被追踪的Futures不是可重入的(这意味着在任何给定时刻,只有一个待处理的仪器化异步函数实例)。如果不是这种情况,Future生命周期跟踪将会出错。

跟踪信息的时间戳和传输

虽然跟踪仪器本身是平台无关的,但它需要一种获取时间戳和从DUT到主系统传输数据的方式。

要为库提供时间戳函数,请使用#[timestamp]宏。例如

#[utrace::timestamp]
fn utrace_timestamp_fn() -> u64 {
    (Tim15::now() - <Tim15 as Monotonic>::ZERO).to_micros()
}

在当前版本中,时间戳函数的签名必须为rust fn() -> u64

要定义一个传输,可以使用#[default_transport]注解一个函数,如下所示

#[utrace::default_transport]
pub fn write(buf: &[u8]) {
    ...
}

当前实现提供基于RTT的传输实现,在utrace_rtt crate中。

注意,当前实现需要一个临界区的实现。例如,如果您正在使用单核ARM MCU,您可以将以下内容添加到您的Cargo.toml中。

cortex-m = { version = "0.7.7", features = ["critical-section-single-core"] }

到你的Cargo.toml。

跟踪数据解释

存储在输出elf二进制文件中的元数据,用于跟踪解释。正确捆绑这些元数据需要在二进制链接期间将utrace_linker.x脚本传递给链接器。这可以通过在build.rs脚本中添加类似的内容来实现

println!("cargo::rustc-link-arg=-Tutrace_linker.x");

或者通过添加

rustflags = [
  "-C", "link-arg=-Tutrace_linker.x"
]

请修改您的 .cargo/config.toml 文件。第一种方法应优先于第二种方法。

要提取元数据和解释跟踪数据流,应使用 utrace_parser 包。此包提供的二进制文件名为 utrace-capture,可以从 TCP 连接或 stdin 接收原始跟踪流,并将跟踪数据写入 chrome://tracing 格式。要安装它,请执行

cargo install --locked utrace_parser --features="cli"

假设使用 OpenOCD 作为 DUT 接口。在这种情况下,您应该在 OpenOCD 初始化脚本中有以下内容

rtt setup 0x20000000 0x20000 "SEGGER RTT"
rtt server start 9001 0
rtt start

这将告诉 OpenOCD 监听端口 9001,并将通道 0 的原始 RTT 数据发送到连接的客户端。要在此配置下捕获和保存跟踪流,请运行

utrace-capture <path to firmware elf executable> --tcp localhost:9001 --out-ct trace_out

跟踪将被捕获在 trace_out_xxx.json 文件中。要结束捕获,请按 Ctrl+C。如果您使用 Chrome 浏览器,可以使用 chrome://tracing 打开这些跟踪,或者使用 Perfetto UI

注意,probe-rs(cargo embed)的 RTT 功能尝试连接到服务器,而不是监听端口,因此您需要使用 --tcp-server 标志,例如

utrace-capture <path to firmware elf executable> --tcp-server 0.0.0.0:9001 --out-ct trace_out

可以使用 --stdin 标志从 stdin 捕获跟踪数据。

依赖项

~1.2–2.1MB
~45K SLoC