使用Tracealyzer调试Zephyr中的优先级反转

2025-04-21

Percepio Tracealyzer已经在600多个支持Zephyr的开发板上完成了验证,可以帮助开发人员改进Zephyr应用的调试和性能分析。

Zephyr结构良好的构建系统和配置框架使得跨硬件平台的调试和跟踪变得更加容易。最新的测试表明,Tracealyzer与我们测试的649块电路板中的617块兼容。不兼容的主板大多有内存限制(可用于跟踪的内存少于32KB),或者是需要额外主机编译器配置的模拟系统。

开发板列表:https://docs.zephyrproject.org/latest/boards/index.html#

对于Zephyr开发者来说,如果你正在使用的开发板已在支持列表中,那么现在就可以使用Tracealyzer在基于时间轴的直观界面可视化系统运行行为,包括线程执行、CPU使用情况及内核事件。

在Zephyr中使用Tracealyzer

为Zephyr设置Tracealyzer跟踪很简单,在Zephyr应用中启用Tracealyzer快照跟踪的步骤如下:

• 确保硬件有足够的内存。为了有效跟踪,建议至少使用32KB。

• 修改Zephyr配置,在project.conf添加:

CONFIG_TRACING=y CONFIG_PERCEPIO_TRACERECORDER=y CONFIG_PERCEPIO_TRC_CFG_STREAM_PORT_RINGBUFFER=y CONFIG_PERCEPIO_TRC_START_MODE_START=y

• 如果内存紧张,可以减少RingBuffer的大小:

CONFIG_PERCEPIO_TRC_CFG_STREAM_PORT_RINGBUFFER_SIZE = 5120

• 构建并运行应用程序,Tracealyzer将收集分析数据,后续可以分析这些数据了解系统行为。

有关更详细的指南,可以查看Zephyr设置文档:https://percepio.com/getstarted/latest/html/zephyr.html#using-the-syscall-extension-zephyr-3-4-0-and-later。

用Tracealyzer调试

Zephyr中的优先级反转

在像Zephyr这样的实时系统中,一个常见的问题是优先级反转,因为低优先级的任务占用了高优先级任务需要的资源导致高优先级任务被阻塞。如果任务调度和同步行为不可见,很难检测到这个问题。

诊断优先级反转示例

在一个基于Zephyr的应用程序中,其中高优先级的DataProcessingTask任务应该立即运行,但意外地延迟了。低优先级的SensorTask持有互斥信号量,阻止了DataProcessingTask任务的执行。

使用Tracealyzer调试Zephyr中的优先级反转 (https://ic.work/) 技术资料 第1张

原则上,高优先级任务(上图的H)不应该被低优先级任务阻塞。在实践中,某些设计决策无论可能会导致这种情况发生,这种情况被称为优先级反转。

通过Tracealyzer跟踪调试

1 捕获跟踪数据:运行启用了Tracealyzer跟踪功能的应用程序,收集系统执行的快照信息。

2 分析执行时间轴:在Tracealyzer中打开跟踪文件并查看任务执行图。

3 识别阻塞依赖:使用Tracealyzer可视化工具查找DataProcessingTask任务正在等待的位置,并查看哪个低优先级任务正在占用资源。

4 确认优先级反转:如果低优先级任务(SensorTask)阻塞了高优先级任务(DataProcessingTask),检查是否启用了优先级继承机制。

5 解决问题

启用互斥信号量的优先级继承(在prj.conf中设置CONFIG_PRIORITY_CEILING=y)。

优化任务调度,减少阻塞时间。

考虑分解长时间运行的低优先级任务。

使用Tracealyzer,这种类型的分析变得简单明了,帮助用户快速查明和解决优先级反转问题。

使用Tracealyzer调试Zephyr中的优先级反转 (https://ic.work/) 技术资料 第2张

多任务软件系统在运行时的实际行为,取决于许多因素,比如任务和中断的时间、它们的相互作用和输入。凭借Zephyr的强大架构和我们验证的开发板支持,通过Tracealyzer跟踪工具,用户可以更好地了解Zephyr系统的运行时世界。

麦克泰技术代理Tracealyzer,具有丰富的RTOS分析软件与调试工具使用方面的知识和经验,欢迎咨询info@bmrtech.com。

文章推荐

相关推荐