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 和所有相关类型的 FreeRTOS 服务,包括任务、队列、信号量、互斥体、事件组、队列集、流缓冲区、消息缓冲区、任务通知和软件计时器。下面给出了一些示例。
FreeRTOS 任务
FreeRTOS 系统的核心是任务的概念,任务是由 FreeRTOS 内核调度以提供多任务处理的线程。每个任务都有自己的堆栈和固定的调度优先级,这对于功能正确性和性能非常重要。Tracealyzer 可让您分析不同优先级分配的行为和性能,以及任务的堆栈使用情况。如果你的堆栈太小,你会因为堆栈溢出而冒着讨厌的错误的风险。如果它们太大,您将浪费应用程序其他地方可能需要的宝贵 RAM。
跟踪视图(左上方)显示了任务调度和对 FreeRTOS API 函数的调用。这使您可以准确地看到任务何时被激活、它们何时实际执行以及为什么它们有时没有按预期执行。您还可以查看显示哪些任务正在消耗处理器时间的概览,如“CPU 负载图”(右)所示。还提供详细的统计信息,例如任务执行时间和响应时间。
FreeRTOS API
FreeRTOS 提供了多种 API 用于在任务之间传递数据和保护共享资源,例如队列、 信号量和互斥体。这些 API 函数可能会阻塞调用任务的执行,直到另一个任务执行了匹配操作。此类 API 调用可能会在源代码中不明显的任务之间形成依赖关系网络。Tracealyzer 可以可视化任务交互,从而更容易理解、调试和优化 FreeRTOS 应用程序。
队列 API
队列允许 FreeRTOS 任务通过发送和接收消息进行通信。队列具有固定数量的插槽,并且消息通常按 FIFO 顺序缓冲。发送方调用xQueueSend将消息添加到队列中。接收者任务调用xQueueReceive从队列中获取下一条消息。
如果尝试将消息发送到已满队列或尝试从空队列中读取消息,则队列操作可能会阻塞。下面的屏幕截图显示了 Tracealyzer 如何显示队列使用情况和阻塞情况。TX 任务向队列发送两条消息。这会唤醒 RX 任务(因此是绿色标签)并接收两条消息。最后,任务被 xQueueReceive 阻塞(红色标签),因为队列现在是空的。
队列形成了 TX 和 RX 之间的依赖关系,可以在下面的通信流图中看到。箭头的方向表示使用情况,即 TX 正在发送到队列,而 RX 正在从队列中接收。双击任何节点会显示相应的事件。请注意,这是一个非常基本的示例。这些图对于大型应用程序来说非常有趣,因为可以显示整个任务依赖关系网络。
阻塞也可能导致超时,具体取决于 xQueueReceive 和 xQueueSend 的超时参数。超时事件在 Tracealyzer 中显示为橙色标签,如下所示。许多 FreeRTOS API 调用都可能出现超时,而不仅仅是队列,并且跟踪非常重要。有些可能是故意的,而另一些可能表示严重错误。
信号量 API
信号量允许唤醒特定事件的任务。这比队列需要更少的内存,适用于不需要额外数据的情况。信号量可以看成是一个信号,调用xSemaphoreGive 发送,调用xSemaphoreTake接收。示例屏幕截图如下所示。请注意,RX 任务被先前对 xSemaphoreTake 的调用阻止,并且仅在 TX 调用 xSemaphoreGive 后唤醒。
信号量也可用于保护代码中的关键部分,即互斥。但是,当为此目的使用常规信号量时,存在优先级反转的风险,这意味着高优先级任务会被低优先级任务延迟。下面提供了一个示例。高优先级任务(红色)调用 xSemaphoreTake 并被阻塞,因为信号量已被低优先级任务(绿色)占用。在绿色任务可以释放信号量之前,一个不相关的中等优先级任务(黄色)被唤醒并抢占绿色任务。这样,红色任务也必须等待不相关的黄色任务,尽管它的调度优先级较低。
右视图显示了 Tracealyzer 的“Actor Instance Graph”中高优先级任务的响应时间,可以轻松发现此类优先级倒置问题等异常情况。图表中的每个数据点显示了一个任务的单次执行,Y 轴显示了从激活到完成的响应时间。优先级反转问题会导致异常值,通过双击它,详细的跟踪视图会导航到该确切位置,显示相关的软件事件。
互斥 API
FreeRTOS 提供 Mutex 对象以允许关键部分没有优先级反转的风险。互斥体的使用方式与信号量几乎相同,并使用相同的 API 函数 xSemaphoreTake 和 xSemaphoreGive。但是,互斥锁通常按顺序由相同的任务锁定(获取)和释放(给定),如下所示,以提供互斥。
互斥对象实现优先级继承协议以避免优先级倒置。下面的示例显示了互斥锁在 Tracealyzer 中的显示方式。蓝色标签显示优先级继承,其中持有任务的优先级被提升(继承)到与等待任务相同的级别,以避免不合适的抢占。
此跟踪视图与大量可视化概览相结合,可让您轻松了解 FreeRTOS 系统的实时行为。您可以验证任务优先级是否合适以及系统是否按设计工作。如果出现问题,您可以在不停止系统的情况下隔离和调试实时行为,尤其是结合应用程序日志记录(见下文)。您还可以分析系统以确保它以有效的方式运行,从而充分利用您的硬件。
应用程序日志
您可以在应用程序代码中记录自定义事件和数据,并将其与 FreeRTOS 内核跟踪一起显示在 Tracealyzer 中。这提供了在运行时对应用程序代码的可见性,以便于调试和分析。这对于实时算法特别有用,例如信号处理和控制回路。
在上面的示例中,PID 控制回路中的变量已记录为用户事件(黄色标签)。然后可以随时间绘制循环变量,与软件执行并行,以分析延迟和抖动以及任务执行。
状态转换也可以记录并显示在逻辑分析仪视图中,其中随着时间的推移显示多个状态变量。结果可以显示在跟踪视图中(如左侧所示)或汇总为状态图(右侧),从而很容易发现不正确的行为。
如何工作的?
您不需要任何特定硬件即可使用 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 上的跟踪流。