Zephyr tracing系统--1 简介

Creative Commons
本作品采用知识共享署名

本文简要介绍Zephyr tracing系统的功能和特性。

Zephyr在几乎所有的内核对象中都埋入了钩子函数,通过对钩子函数的不同实现可以让上位机工具对Zephyr内核运行情况进行可视化分析。
Zephyr对tracing系统具有高配置性,可以通过配置选择一种或者多种要trace的对象,在不需要的时候可以通过配置移除tracing系统。也可以选择不同的tracing tool和后端。

Tracing对象

Zephyr可以tracing以下对象, 但不同的trace tool会根据实现的不一样tracing其中的全部或部分

  • SYSCALL_TRACING
  • TRACING_THREAD
  • TRACING_WORK
  • TRACING_ISR
  • TRACING_SEMAPHORE
  • TRACING_MUTEX
  • TRACING_CONDVAR
  • TRACING_QUEUE
  • TRACING_FIFO
  • TRACING_LIFO
  • TRACING_STACK
  • TRACING_MESSAGE_QUEUE
  • TRACING_MAILBOX
  • TRACING_PIPE
  • TRACING_HEAP
  • TRACING_MEMORY_SLAB
  • TRACING_TIMER

tracing tool

Zephyr支持多种tracing tool,在编译的时候根据其配置只能选择以下任意一种:

  • sysview
  • tracerecorder
  • ctf
  • user
  • test
    如下图

sysview

sysview是Segger的一个trace工具,虽然sysview支持uart和快照,但目前Zephyr只支持Jlink RTT向上位机传送tracing数据流。
sysview的代码路径:
modules/debug/segger:Segger sysview源代码
zephyr/modules/segger: 对Segger sysview进行初始化
zephyr/subsys/tracing/sysview: 对Segger sysview进行配置,将Segger sysview的API封装成zephyr使用的tracing API
sysview实现了Zephyr所有的tracing API

tracerecorder

tracerecorder按照自己的格式将数据送给上位机的Tracealyzer,目前支持Jlink的RTT和ARM ITM传送数据流。
tracerecorder的代码路径:
modules/debug/TraceRecoder:TraceRecoder的源代码,其中kernelports/Zephyr/streamports是Zephyr支持的,目前只有RTT和ARM ITM
zephyr/modules/traceRecoder: 构建文件
zephyr对traceRecoder的封装都在外部模块中
tracerecorder实现了Zephyr所有的tracing API

CTF

CTF是Zephyr根据CTF标准格式实现的,支持同步和异步trace,trace的后端有4种:

  • ram: 保存在ram中
  • uart: 通过uart传输
  • usb: 通过USB传输
  • posix: 保存到文件系统

CTF的代码路径:
zephyr/subsys/tracing/ Zephyr trace核心代码和backend实现,只对接CTF
zephyr/subsys/tracing/CTF CTF event实现和trace API封装
CTF只实现了上下文切换,isr出入,idle和部分thread的trace API

user

user只实现了上下文切换,isr出入,idle的trace,这些函数以弱符号留空,可由用户在编新应用时实现强符号覆盖。
格式和backend都可以由用户自定义
user的代码路径:
zephyr/subsys/tracing/user
user目前只支持上下文切换,isr出入,idle的tracing

test

test用于,钩子函数中只有打印,目前除k_work和k_poll外其它的都实现。
user的代码路径:
zephyr/subsys/tracing/test

后续文章

预计会写如下5篇:

  • Trace系统的配置和调用框架。
  • user和test的分析与使用,这两部分比较简单会合并为一篇文章。
  • sysview,分析实现代码,手上没有jlink就不说明如何使用了。
  • tracerecorder, 分析实现代码,如果tracealyzer的个人license申请下来了,就多写如何使用。
  • CTF,分析实现代码与使用说明,比较遗憾的时CTF是几种当中实现得最不全的。