写点什么

Azure RTOS ThreadX 系统分析之 TraceX

作者:SkyFire
  • 2023-12-10
    陕西
  • 本文字数:3255 字

    阅读完需:约 11 分钟

什么是 ThreadX

Azure RTOS ThreadX 是 Microsoft 提供的高级工业级实时操作系统 (RTOS)。 它是专门为深度嵌入式实时 IoT 应用程序设计的。 Azure RTOS ThreadX 提供高级计划、通信、同步、计时器、内存管理和中断管理功能。 此外,Azure RTOS ThreadX 具有许多高级功能,包括 picokernel™ 体系结构、preemption-threshold™ 计划、event-chaining™、执行分析、性能指标和系统事件跟踪。 Azure RTOS ThreadX 非常易于使用,适用于要求极其苛刻的嵌入式应用程序。 Azure RTOS ThreadX 在各种产品(包括消费者设备、医疗电子设备和工业控制设备)上的部署次数已达数十亿次。

什么是 TraceX?

Azure RTOS TraceX 是 Microsoft 基于主机的分析工具,它为开发人员提供实时系统事件的图形视图,使其能够可视化和更好地了解其实时系统的行为。 借助 Azure RTOS TraceX,开发人员可以清楚地看到发生的各种系统事件,例如,在标准调试工具视图外部发生的中断和上下文切换。 由于能够识别和调查这些事件,并在整个系统的操作上下文中查明这些事件的发生时间,开发人员可以通过查找意外的行为并进一步调查特定的方面来解决编程问题。跟踪信息存储在目标系统上的缓冲区中,该缓冲区的位置和大小在运行时由应用程序确定。 Azure RTOS TraceX 可处理以适当方式构造的任何缓冲区,这不仅包括从 Azure RTOS ThreadX,而且还包括从任何应用程序或 RTOS 构造的缓冲区。 可以随时(事后调查分析时或设置断点后)将跟踪信息上传到主机进行分析。 Azure RTOS ThreadX 实现一个循环缓冲区,当系统功能异常或发生其他重大事件时,该缓冲区可以提供最近的“N”个事件用于检查。

安装

Windows 11 用户可以直接通过 winget 安装,如下:


skyfire@skyfire-pc ~> winget.exe install 9NF1LFD5XXG3                                                            (base)已找到 Azure RTOS TraceX [9NF1LFD5XXG3] 版本 Unknown此程序包是通过 Microsoft Store 提供的。winget 可能需要代表当前用户从 Microsoft Store 获取该程序包。的协议 Azure RTOS TraceX [9NF1LFD5XXG3] 版本 Unknown版本: Unknown发布者: Microsoft Corporation发布服务器 URL: https://docs.microsoft.com/azure/rtos发布服务器支持 URL: https://azure.microsoft.com/support/options描述: Azure RTOS TraceX is Microsoft's host-based analysis tool that provides developers with a graphical view of real-time system events and enables them to visualize and better understand the behavior of their real-time systems.许可证: ms-windows-store://pdp/?ProductId=9NF1LFD5XXG3隐私 URL: https://go.microsoft.com/fwlink/?LinkId=248681协议:Category: Developer toolsPricing: FreeFree Trial: NoTerms of Transaction: https://aka.ms/microsoft-store-terms-of-transactionSeizure Warning: https://aka.ms/microsoft-store-seizure-warningStore License Terms: https://aka.ms/microsoft-store-license

发行商要求你在安装前查看上述信息并接受协议。是否同意上述条款?[Y] 是 [N] 否: y正在启动程序包安装... ██████████████████████████████ 100%已成功安装skyfire@skyfire-pc ~>
复制代码

系统组成


ThreadX 中的跟踪系统分为两部分,采样与分析。


采样功能位于目标设备,由 ThreadX 系统与应用共同完成系统事件的采样,存储到预先分配的缓冲区 Trace Buffer 中。


Trace Buffer 中的数据分为三部分:


  1. Header:存储了这个 Buffer 的信息,如大小、最多支持多少数据类型(Registry)等。

  2. Registry:支持的事件类型。

  3. Events:记录的事件信息。


通过 dump 出此 buffer 的内存,形成 trx 采样文件,作为调试机 TraceX 应用程序的输入。TraceX 对 trx 文件进行分析并可视化出来,共开发人员了解系统运行状况。

TraceX 界面介绍




  1. 工具栏:各种工具按钮。

  2. 线程执行情况分析:从工具栏按钮触发,主要统计各线程的运行时间占比。

  3. 性能分析:统计线程上下文切换、抢占、中断等次数。

  4. 栈空间分析:分析各线程栈的使用情况。

  5. 当前事件信息。

  6. 查找事件:可以根据事件各种属性在不同的作用域下查找。


  1. 事件信息:鼠标悬停在对应事件图标上,会显示事件信息。

  2. 事件信息:双击事件图标的时候,会显示事件信息,与鼠标悬停不同的是,焦点丢失后窗口不会关闭,所以可以查看多个事件。

  3. 事件间周期数:选中一段时间周期,这个值会自动计算。

  4. 线程信息:每行表示一个线程,右侧会显示每个事件的所属线程分布。

  5. 视图:视图分为两个,当前是序列视图,按照事件紧密排列,还有一种时间视图,会按照时间排列事件。



  1. 放大缩小

  2. 事件切换:可以按照不同的维度切换事件,如按照关联的事件对象(如邮箱),或者关联的线程上下文,同一类型事件等。



  1. 文件系统统计:包括打开、写入、读取、刷新、关闭、目录 cache miss 等统计。

  2. 函数执行时间统计:统计哪些函数消耗 cpu 时间较长。

  3. 网络统计:统计各种网络协议的收发包情况。

  4. 采样文件信息:目标系统采样文件的信息。

TraceX 支持的跟踪事件

  • 上下文切换

  • 抢占

  • 挂起

  • 系统中断

  • 应用程序特定事件

  • 所有 Azure RTOS ThreadX API 调用

  • 所有 Azure RTOS NetX API 调用

  • 所有 Azure RTOS FileX API 调用

  • 所有 Azure RTOS USBX API 调用

  • 应用程序定义的事件和信息

关键函数

  • VOID _tx_trace_initialize(VOID)

  • 跟踪初始化,设置各种指针为 NULL

  • 定义为 TX_TRACE_INITIALIZE 宏,在_tx_initialize_high_level 中调用

  • VOID _tx_trace_object_register(UCHAR object_type, VOID *object_ptr, CHAR *object_name, ULONG parameter_1, ULONG parameter_2)

  • 注册各种事件类型

  • 定义为宏 TX_TRACE_OBJECT_REGISTER,在各种资源模块初始化的时候调用

  • VOID _tx_trace_object_unregister(VOID *object_ptr);

  • 取消注册对象

  • VOID _tx_misra_trace_event_insert(ULONG event_id, VOID *info_field_1, ULONG info_field_2, ULONG info_field_3, ULONG info_field_4, ULONG filter, ULONG time_stamp)

  • 定义为 TX_TRACE_IN_LINE_INSERT 宏,记录事件。

  • UINT _tx_trace_enable(VOID *trace_buffer_start, ULONG trace_buffer_size, ULONG registry_entries);

  • 启用 Trace 功能,入参分别为 Trace 缓冲区的位置、大小、以及允许注册的跟踪类型数量。

  • UINT _tx_trace_event_filter(ULONG event_filter_bits);

  • 过滤跟踪事件,通常在_tx_trace_enable 前调用,event_filter_bits 由各种事件掩码位运算组成。

  • UINT _tx_trace_event_unfilter(ULONG event_unfilter_bits);

  • 不过滤事件。(参照_tx_trace_event_filter)

  • UINT _tx_trace_disable(VOID);

  • 关闭 Trace。

  • VOID _tx_trace_isr_enter_insert(ULONG isr_id);

  • 进入中断处理。参数为中断 ID。

  • VOID _tx_trace_isr_exit_insert(ULONG isr_id);

  • 退出中断处理。参数为中断 ID。

  • UINT _tx_trace_buffer_full_notify(VOID (*full_buffer_callback)(VOID *buffer));

  • 注册当 buffer 满的时候的回调函数。

  • UINT _tx_trace_user_event_insert(ULONG event_id, ULONG info_field_1, ULONG info_field_2, ULONG info_field_3, ULONG info_field_4);

  • 插入用户事件。

  • UINT _tx_trace_interrupt_control(UINT new_posture);

  • 修改中断状态。参数为新的状态,返回旧的状态。

如何打开 Trace

ThreadX 的所有模块功能都是在 threadx/build/custom_inc/tx_user.h文件中通过宏打开的(需要先执行 cmake)。


在该文件中将 TX_ENABLE_EVENT_TRACE 的注释删除,重新构建 threadx 即可使用 TraceX 的功能。


/* Determine if the trace event logging code should be enabled. This causes slight increases in    code size and overhead, but provides the ability to generate system trace information which    is available for viewing in TraceX.  */

#define TX_ENABLE_EVENT_TRACE
复制代码

总结

  • TraceX 的优点:


  1. 功能丰富的分析程序,将各种事件可视化显示;

  2. 支持编译期与运行期两种方式开启;

  3. 动态注册事件类型;

  4. 支持大量的内置事件;


  • TraceX 缺点:


  1. 需要手工使用第三方程序 dump Trace Buffer 的内存(往往需要中断程序的执行);

发布于: 17 小时前阅读数: 12
用户头像

SkyFire

关注

这个cpper很懒,什么都没留下 2018-10-13 加入

会一点点cpp的苦逼码农

评论

发布
暂无评论
Azure RTOS ThreadX 系统分析之TraceX_TraceX_SkyFire_InfoQ写作社区