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是几种当中实现得最不全的。