Tracealyze操作系统跟踪工具

Tracealyzer嵌入式软件实时操作系统 跟踪工具,可以帮助您找到优化软件的机会。您的软件中可能存在不必要的资源冲突,这些冲突对于优化而言是“完美的结果”,而微小的更改可以显着改善实时响应能力和性能。通过使用Tracealyzer,可以减少故障排除时间,并花费更多时间开发有价值的新功能。这意味着开发效率将总体提高,并具有在预算范围内交付高质量嵌入式软件的更好能力。

 

Tracealyzer 提供的洞察力意味着更少的调试和更快的开发。Flyability 的首席固件开发人员报告称,Tracealyzer 将他们的生产力提高了一倍——“使用此工具可以很明显地解决原本需要数天才能解决的问题,而且只需快速修复即可”。

 

更好的洞察力可以提高实时性能和效率。一个例子是 Serious Integrated,他们找到了将代码的 CPU 负载降低 67% 的方法,从而能够使用更具成本效益的处理器。另一个例子是 RFI 技术解决方案,他们发现使用Tracealyzer 的载波切换解决方案速度提高了 300 倍。

 

更好的洞察力还可以提高软件的可靠性。Tracealyzer 可以轻松查明实时行为的变化,从而提高稳定性并降低难以捉摸的错误的风险。

 

分析 FreeRTOS 应用程序
FreeRTOS 任务
FreeRTOS API
队列 API
信号量 API
互斥 API
应用程序日志

 

Tracealyzer 还支持多种领先的 RTOS 平台,以及 Linux 跟踪
 

Tracealyzer 提供了许多不同抽象级别的视图。所有这些都为简化的工作流程而连接。通过这种方式,您可以在高级别概览中发现问题,例如 CPU 负载峰值,然后深入了解细节以了解原因。

跟踪视图:

提供了任务调度和中断、FreeRTOS API 调用以及应用程序代码中记录的自定义“用户事的详细时间线。这样,您可以检查您的代码是否按预期执行,并了解如何改进软件设计。大量的可视化概览包括例如 CPU 负载、任务计时、堆栈使用和堆内存分配(即 malloc/free)。此类概览提供了资源使用情况随时间变化的概况,可帮助您了解全局、发现异常并优化系统。

Tracealyzer 中显示的 FreeRTOS 任务调度和 CPU 负载(点击放大)

 

Tracealyzer 支持所有最新版本的 FreeRTOS 和所有相关类型的 FreeRTOS 服务,包括任务、队列、信号量、互斥体、事件组、队列集、流缓冲区、消息缓冲区、任务通知和软件计时器。下面给出了一些示例。
 

FreeRTOS 任务

FreeRTOS 系统的核心是任务的概念,任务是由 FreeRTOS 内核调度以提供多任务处理的线程。每个任务都有自己的堆栈和固定的调度优先级,这对于功能正确性和性能非常重要。Tracealyzer 可让您分析不同优先级分配的行为和性能,以及任务的堆栈使用情况。如果你的堆栈太小,你会因为堆栈溢出而冒着讨厌的错误的风险。如果它们太大,您将浪费应用程序其他地方可能需要的宝贵 RAM。

 

Tracealyzer 中的 FreeRTOS 任务和 CPU 负载

 

跟踪视图(左上方)显示了任务调度和对 FreeRTOS API 函数的调用。这使您可以准确地看到任务何时被激活、它们何时实际执行以及为什么它们有时没有按预期执行。您还可以查看显示哪些任务正在消耗处理器时间的概览,如“CPU 负载图”(右)所示。还提供详细的统计信息,例如任务执行时间和响应时间。

 

Tracealyzer 中显示的 FreeRTOS 任务调度和 CPU 负载(点击放大)

 

FreeRTOS API

FreeRTOS 提供了多种 API 用于在任务之间传递数据和保护共享资源,例如队列、 信号量和互斥体这些 API 函数可能会阻塞调用任务的执行,直到另一个任务执行了匹配操作。此类 API 调用可能会在源代码中不明显的任务之间形成依赖关系网络。Tracealyzer 可以可视化任务交互,从而更容易理解、调试和优化 FreeRTOS 应用程序

 

Tracealyzer 中的 FreeRTOS 任务和 CPU 负载

 

队列 API

队列允许 FreeRTOS 任务通过发送和接收消息进行通信。队列具有固定数量的插槽,并且消息通常按 FIFO 顺序缓冲。发送方调用xQueueSend将消息添加到队列中。接收者任务调用xQueueReceive从队列中获取下一条消息。

如果尝试将消息发送到已满队列或尝试从空队列中读取消息,则队列操作可能会阻塞。下面的屏幕截图显示了 Tracealyzer 如何显示队列使用情况和阻塞情况。TX 任务向队列发送两条消息。这会唤醒 RX 任务(因此是绿色标签)并接收两条消息。最后,任务被 xQueueReceive 阻塞(红色标签),因为队列现在是空的。

 

FreeRTOS 中的队列阻塞

 

队列形成了 TX 和 RX 之间的依赖关系,可以在下面的通信流图中看到。箭头的方向表示使用情况,即 TX 正在发送到队列,而 RX 正在从队列中接收。双击任何节点会显示相应的事件。请注意,这是一个非常基本的示例。这些图对于大型应用程序来说非常有趣,因为可以显示整个任务依赖关系网络。

 

Tracealyzer 中的 FreeRTOS 任务依赖项

 

阻塞也可能导致超时,具体取决于 xQueueReceive 和 xQueueSend 的超时参数。超时事件在 Tracealyzer 中显示为橙色标签,如下所示。许多 FreeRTOS API 调用都可能出现超时,而不仅仅是队列,并且跟踪非常重要。有些可能是故意的,而另一些可能表示严重错误。

 

FreeRTOS 队列超时,显示在 Tracealyzer 中

 

 

信号量 API

信号量允许唤醒特定事件的任务。这比队列需要更少的内存,适用于不需要额外数据的情况。信号量可以看成是一个信号,调用xSemaphoreGive 发送,调用xSemaphoreTake接收示例屏幕截图如下所示。请注意,RX 任务被先前对 xSemaphoreTake 的调用阻止,并且仅在 TX 调用 xSemaphoreGive 后唤醒。

 

使用 FreeRTOS 信号量来指示另一个任务。

 

信号量也可用于保护代码中的关键部分,即互斥。但是,当为此目的使用常规信号量时,存在优先级反转的风险,这意味着高优先级任务会被低优先级任务延迟。下面提供了一个示例。高优先级任务(红色)调用 xSemaphoreTake 并被阻塞,因为信号量已被低优先级任务(绿色)占用。在绿色任务可以释放信号量之前,一个不相关的中等优先级任务(黄色)被唤醒并抢占绿色任务。这样,红色任务也必须等待不相关的黄色任务,尽管它的调度优先级较低。

 

Tracealyzer 中的优先级反转

右视图显示了 Tracealyzer 的“Actor Instance Graph”中高优先级任务的响应时间,可以轻松发现此类优先级倒置问题等异常情况。图表中的每个数据点显示了一个任务的单次执行,Y 轴显示了从激活到完成的响应时间。优先级反转问题会导致异常值,通过双击它,详细的跟踪视图会导航到该确切位置,显示相关的软件事件。

 

互斥 API

FreeRTOS 提供 Mutex 对象以允许关键部分没有优先级反转的风险。互斥体的使用方式与信号量几乎相同,并使用相同的 API 函数 xSemaphoreTake 和 xSemaphoreGive。但是,互斥锁通常按顺序由相同的任务锁定(获取)和释放(给定),如下所示,以提供互斥。

 

Tracealyzer 中的 FreeRTOS 互斥锁使用

 

互斥对象实现优先级继承协议以避免优先级倒置。下面的示例显示了互斥锁在 Tracealyzer 中的显示方式。蓝色标签显示优先级继承,其中持有任务的优先级被提升(继承)到与等待任务相同的级别,以避免不合适的抢占。

 

在 FreeRTOS 中使用互斥锁,具有阻塞和优先级继承,在 Tracealyzer 中显示

 

此跟踪视图与大量可视化概览相结合,可让您轻松了解 FreeRTOS 系统的实时行为。您可以验证任务优先级是否合适以及系统是否按设计工作。如果出现问题,您可以在不停止系统的情况下隔离和调试实时行为,尤其是结合应用程序日志记录(见下文)。您还可以分析系统以确保它以有效的方式运行,从而充分利用您的硬件。

应用程序日志

您可以在应用程序代码中记录自定义事件和数据,并将其与 FreeRTOS 内核跟踪一起显示在 Tracealyzer 中。这提供了在运行时对应用程序代码的可见性,以便于调试和分析。这对于实时算法特别有用,例如信号处理和控制回路。

 

用户事件允许自定义数据图

在上面的示例中,PID 控制回路中的变量已记录为用户事件(黄色标签)。然后可以随时间绘制循环变量,与软件执行并行,以分析延迟和抖动以及任务执行。

 

Tracealyzer 中的状态变量分析

 

状态转换也可以记录并显示在逻辑分析仪视图中,其中随着时间的推移显示多个状态变量。结果可以显示在跟踪视图中(如左侧所示)或汇总为状态图(右侧),从而很容易发现不正确的行为。

 

如何工作的?

您不需要任何特定硬件即可使用 Tracealyzer。跟踪可以完全在软件中完成,到几 KB 的小 RAM 缓冲区。Tracealyzer 还允许您使用支持的调试探针(如 STLINK 或 Segger J-Link)或通过以太网或 Wifi 等功能性 I/O 接口连续将跟踪数据流式传输到主机。这样,您可以长时间监控系统并捕获任何问题。

适用于 FreeRTOS 的 Tracealyzer 依赖于一个跟踪记录器库,该库提供完整的源代码,可以按照快速入门指南在几分钟内集成到现有应用程序中FreeRTOS 内核和 API 事件会自动跟踪,而且跟踪设置很容易。您还可以在应用程序代码中记录其他事件,就像 printf 调用一样,但开销最小,并在 Tracealyzer 中查看结果。

开箱即可支持 Arm Cortex-M 设备(例如 STM32),以及 Espressif ESP32、PIC32 和许多其他嵌入式处理器。只需稍作配置更改即可轻松支持其他处理器。跟踪基本上适用于任何 C/C++ 编译器,并且可以配置为使用最少的 RAM 和 ROM。Percepio 为常用开发工具提供插件和集成,包括 Eclipse/GDB、STM32CubeIDE、Keil MDK、IAR、ESP-IDF 和 Lauterbach。

对于 ESP32 开发人员,Tracealyzer v4.5 及更高版本还支持 ESP-IDF 版本的 FreeRTOS,包括 SMP 多核跟踪。通过 OpenOCD 支持 ESP32 上的跟踪流。