NASA F'项目中的速率组(Rate Group)设计模式详解
速率组概述
在嵌入式软件开发中,经常需要以固定频率执行某些操作。NASA F'框架提供了一种称为"速率组"(Rate Group)的机制来管理这些基于时间的操作。速率组允许开发者将需要以相似频率运行的操作分组管理,例如控制算法可以运行在10Hz,遥测采集运行在1Hz,后台任务运行在0.1Hz等。
速率组架构
核心组件
速率组系统由三个主要组件构成:
-
速率组驱动器(RateGroupDriver):作为整个系统的"时钟"源,通常由系统定时中断或其他可靠时钟源驱动。它负责将基础时钟信号分频为多个较慢的重复信号。
-
主动速率组(ActiveRateGroup):包含多个输出
Sched
端口,以特定频率向这些端口发送消息。连接到这些端口的组件可以按此频率执行重复操作。 -
被动速率组(PassiveRateGroup):与主动速率组功能类似,但执行方式不同。
时钟源与分频机制
速率组驱动器需要一个系统时钟源,该时钟源频率应是所有速率组所需频率的公倍数。这个信号驱动速率组驱动器的CycleIn
端口,并被分频为多个子信号发送给各个速率组。
典型实现中会有一个专门的时钟组件,负责在系统时钟和速率组驱动器的CycleIn
端口调用之间进行转换。在参考实现中,通过循环调用CycleIn
端口并休眠系统时钟时间来模拟系统驱动的时钟。
主动与被动速率组对比
被动速率组特点
- 在调用者上下文中同步执行
- 所有工作(包括连接的组件)都在同一线程中完成
- 优点:执行同步且优先级高
- 缺点:必须确保工作快速完成,否则会阻塞其他速率组
主动速率组特点
- 在独立线程中运行
- 存在系统驱动和执行之间的时间抖动
- 多个主动速率组可以同时启动
- 不会因工作阻塞而影响其他速率组执行
当速率组的同步工作时间超过其周期时间时,会发生"速率组滑移"(rate group slip),并产生WARNING_HI事件。频繁滑移表明系统无法跟上重复工作,需要调整周期时间或将组件移至更慢的速率组。
设计最佳实践
线程优先级设置
主动速率组的线程优先级通常应设置为系统中最高,因为:
- 它们本身开销较低
- 它们启动的组件可能具有高优先级
- 频率越高的速率组优先级应越高
组件连接顺序
主动速率组按顺序向每个连接的组件发送消息。因此:
- 高优先级子组件应连接到较低索引的
Sched
端口 - 低优先级子组件应连接到较高索引的
Sched
端口
主动与被动组件选择
- 被动组件:在速率组上下文中同步运行,便于检测工作是否超时,但会顺序执行
- 主动组件:接收消息后在自己的线程中运行,可以并发执行,但难以检测工作是否超时
参考实现分析
在参考应用Ref
中,速率组用于驱动多个系统组件和SignalGen演示组件。blockDrv
组件驱动速率组驱动器,后者再驱动主动速率组,进而驱动各个组件。
典型实现模式包括:
- 定义速率组拓扑连接
- 实现调度处理程序
- 配置适当的时钟分频比
- 设置合理的线程优先级
常见问题与解决方案
-
速率组滑移:
- 增加周期时间
- 将部分组件移至更慢的速率组
- 优化组件执行效率
-
执行顺序问题:
- 调整组件连接顺序
- 合理设置线程优先级
-
时间抖动:
- 对于时间敏感任务使用被动速率组
- 确保系统时钟稳定可靠
速率组模式是NASA F'框架中管理周期性任务的核心机制,合理使用可以构建出高效可靠的嵌入式系统时序架构。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考