Azure RTOS ThreadX 概述
Azure RTOS ThreadX 是 Microsoft 提供的高级工业级实时操作系统 (RTOS)。 它是专门为深度嵌入式实时 IoT 应用程序设计的。 Azure RTOS ThreadX 提供高级计划、通信、同步、计时器、内存管理和中断管理功能。 此外,Azure RTOS ThreadX 具有许多高级功能,包括 picokernel™ 体系结构、preemption-threshold™ 计划、event-chaining™、执行分析、性能指标和系统事件跟踪。 Azure RTOS ThreadX 非常易于使用,适用于要求极其苛刻的嵌入式应用程序。 Azure RTOS ThreadX 在各种产品(包括消费者设备、医疗电子设备和工业控制设备)上的部署次数已达数十亿次。
ThreadX 占用情况
Azure RTOS ThreadX 的占用空间非常小,最少只需要一个 2KB 的指令区域和 1 KB 的 RAM。 这种大小在很大程度上归功于其非分层 picokernel 体系结构和自动缩放。 自动缩放是指在链接时仅将应用程序使用的服务(和支持基础结构)包括到最终映像中。
下面是 Azure RTOS ThreadX 的一些典型大小特征。
Azure RTOS ThreadX 服务 | 典型大小(以字节为单位) |
---|---|
核心服务(必需) | 2,000 |
队列服务 | 900 |
事件标志服务 | 900 |
信号灯服务 | 450 |
互斥锁服务 | 1,200 |
块内存服务 | 550 |
字节内存服务 | 900 |
ThreadX 执行速度
Azure RTOS ThreadX 可在大多数主流处理器上实现亚毫秒级上下文切换,并且总体速度比其他商业 RTOS 都快。 除了快速,Azure RTOS ThreadX 还具有高度确定性。 无论准备就绪的线程有 200 个还是只有一个,它都能实现同样的高性能。
下面是 Azure RTOS ThreadX 的一些典型性能特征:
快速启动:Azure RTOS ThreadX 可在 120 个周期内启动。
禁用基本错误检查(可选):编译时可以跳过基本的 Azure RTOS ThreadX 错误检查。 当应用程序代码已通过验证,且不再需要对每个参数进行错误检查时,这很有用。 可在编译单元上(而不是在系统范围内)跳过错误检查。
Picokernel 设计:服务不彼此叠加,从而消除了不必要的函数调用开销。
优化中断处理:除非需要抢占,否则只有在进入/退出 ISR 时才会保存/还原暂存寄存器。
优化 API 处理:
Azure RTOS ThreadX 服务 服务时间以微秒为单位* 暂停线程 0.6 继续线程 0.6 发送队列 0.3 接收队列 0.3 获取信号灯 0.2 放置信号灯 0.2 上下文切换 0.4 中断响应 0.0-0.6 *性能指标基于运行频率为 200MHz 的典型处理器。
高级技术
Azure RTO ThreadX 最突出之处是它的 Preemption-Threshold 计划。 此功能是 Azure RTOS ThreadX 独有的,并已成为广泛的学术研究课题。 如需深入了解,请参阅由康考迪亚大学的 Yun Wang 与匹兹堡大学的 Manas Saksena 联合发表的《Scheduling Fixed-Priority Tasks with Preemption Threshold》。
Azure RTOS ThreadX 的主要功能:
- 完整全面的多任务处理功能
- 线程、应用程序计时器、消息队列、计数信号灯、互斥锁、事件标志、块内存池和字节内存池
- 基于优先级的抢占式计划
- 优先级灵活性 - 最多可定义 1024 个优先级
- 协作式计划
- Preemption-Threshold - Azure RTOS ThreadX 的独有功能,有助于减少上下文切换并帮助确保可计划性(根据学术研究)
- 通过 Azure RTOS ThreadX MODULES 进行内存保护
- 完全确定性
- 事件跟踪 - 捕获最后 n 个系统事件/应用程序事件
- Event Chaining - 为每个 Azure RTOS ThreadX 通信或同步对象注册特定于应用程序的“通知”回调函数
- 具有可选内存保护的 Azure RTOS ThreadX MODULES
- 运行时性能指标
- 线程恢复数
- 线程暂停数
- 请求的线程抢占数
- 异步线程中断抢占数
- 线程优先级反转数
- 线程放弃次数
- Execution Profile Kit (EPK)
- 单独中断堆栈
- 运行时堆栈分析
- 优化计时器中断处理
多核支持(AMP 和 SMP)
标准 Azure RTOS ThreadX 通常以非对称多重处理 (AMP) 方式使用,在这种情况下,Azure RTOS ThreadX 的单独副本和应用程序(或 Linux)在每个核心上执行,并通过共享内存或处理器间通信机制(例如 Azure RTOS ThreadX 所支持的 OpenAMP)相互通信。
在高度动态加载处理器的环境中,Azure RTOS ThreadX 对称多重处理 (SMP) 可用于以下处理器系列:
- ARM Cortex-Ax
- ARM Cortex-Rx
- ARM Cortex-A5x(64 位)
- Synopsys ARC HS
Azure RTOS ThreadX SMP 跨 n 个处理器执行动态负载均衡。 它允许任何核心上的任何线程访问所有 Azure RTOS ThreadX 资源(队列、信号灯、事件标志和内存池等)。 Azure RTOS ThreadX SMP 在所有核心上启用全部 Azure RTOS ThreadX API,并引入了以下适用于 SMP 操作的新 API:
UINT tx_thread_smp_core_exclude(TX_THREAD *thread_ptr, ULONG exclusion_map);
UINT tx_thread_smp_core_exclude_get(TX_THREAD *thread_ptr, ULONG *exclusion_map_ptr);
UINT tx_thread_smp_core_get(void);
UINT tx_timer_smp_core_exclude(TX_TIMER *timer_ptr, ULONG exclusion_map);
UINT tx_timer_smp_core_exclude_get(TX_TIMER *timer_ptr, ULONG *exclusion_map_ptr);
通过 Azure RTOS ThreadX MODULES 进行内存保护
使用称为 Azure RTOS ThreadX Modules 的附加产品可将一个或多个应用程序线程捆绑成一个“模块”,该模块可动态加载并在目标上运行(或就地执行)。
使用这些模块可进行现场升级、缺陷修复和程序分区,从而使大型应用程序仅占用活动线程所需的内存。
这些模块还具有独立于 Azure RTOS ThreadX 的地址空间。 这样,Azure RTOS ThreadX 就可以通过 MPU 或 MMU 对模块进行内存保护,从而阻止模块外部的意外访问损坏任何其他软件组件。
符合 MISRA
Azure RTOS ThreadX 和 Azure RTOS ThreadX SMP 的源代码符合 MISRA-C:2004 以及 MISRA C:2012。 MISRA C 是一组编程准则,面向使用 C 编程语言的关键系统。 最初的 MISRA C 准则主要面向汽车业应用;但是,现在人们广泛认可 MISRA C 适用于任何安全关键应用。 Azure RTOS ThreadX 符合 MISRA-C:2004 和 MISRA C:2012 的所有必需规则和强制性规则。
支持大部分常用工具
Azure RTOS ThreadX 支持大部分常用的嵌入式开发工具,包括 IAR 的 Embedded Workbenc,该工具还提供最全面的 Azure RTOS ThreadX 内核感知功能。 其他工具集成包括 GNU (GCC)、ARM DS-5/uVision®、Green Hills MULTI®、Wind River Workbench、Imagination Codescape、Renesas e2studio、Metaware SeeCode、NXP CodeWarrior、Lauterbach TRACE32®、TI Code-Composer Studio、CrossCore 和所有模拟设备。
ThreadX 的适配层
可通过使用各种旧版 RTOS API(FreeRTOS、POSIX、OSEK 等)的 ThreadX 适配层来缓解到 Azure RTOS 的迁移问题。