本文档介绍了Betaflight的实时任务调度系统和性能监控基础设施。调度器协调所有飞行控制任务、传感器处理、通信和用户界面组件的执行,同时严格满足关键飞行控制回路的时序要求。
概述
Betaflight采用基于优先级的协作式多任务调度器,确保关键飞行控制任务的实时性能,同时高效管理优先级较低的后台操作。该调度器能够为陀螺仪采样和PID控制回路保持微秒级的计时精度。
核心架构

任务管理系统
任务结构和属性
Betaflight 中的任务由两个主要结构定义:task_t运行时状态和task_attribute_t静态配置。

任务优先级系统
调度器采用多级优先级系统,包含静态和动态组件:
| 优先级 | 价值 | 用法 | 示例 |
|---|---|---|---|
TASK_PRIORITY_REALTIME |
-1 | 飞行控制关键路径 | 陀螺仪、过滤器、PID |
TASK_PRIORITY_HIGH |
5 | 时间敏感型 I/O | 处方,调度 |
TASK_PRIORITY_MEDIUM_HIGH |
4 | 系统维护 | 主系统 |
TASK_PRIORITY_MEDIUM |
3 | 传感器处理 | 加速度、姿态、电池 |
TASK_PRIORITY_LOW |
2 | 沟通 | 串行、遥测、OSD |
TASK_PRIORITY_LOWEST |
1 | 后台任务 | 堆栈检查,VTXCTRL |
动态优先级计算会根据任务的完成时间增加优先级,以防止任务无人处理:
dynamicPriority = 1 + staticPriority * taskAgePeriods
任务队列管理
调度器维护一个按优先级排序的已启用任务队列:

实时调度引擎
主调度循环
核心调度器以两种不同的模式运行:实时陀螺仪调度和一般任务调度。
陀螺同步计时
调度器与陀螺仪中断保持精确的时间同步:

任务执行和统计
任务执行流程

性能监控
调度器通过多种调试模式提供全面的性能监控:
| 调试模式 | 测量 | 目的 |
|---|---|---|
DEBUG_SCHEDULER |
检查函数运行时间、优先级排序时间和调度器开销 | 通用调度器性能 |
DEBUG_SCHEDULER_DETERMINISM |
陀螺仪计时、延迟任务、计时偏差 | 实时性能分析 |
DEBUG_TIMING_ACCURACY |
CPU 利用率、延迟任务统计信息 | 系统负载监控 |
DEBUG_TASK |
个人任务统计 | 单项任务绩效分析 |

系统负载和资源管理
CPU负载计算
调度程序持续监控系统负载,以防止超出负荷:

衰老与饥饿预防任务
调度器实现了任务老化机制,以防止低优先级任务被饿死:

特殊加急排期规则:
TASK_AGE_EXPEDITE_RXRX 任务:尝试失败后加快处理- OSD 任务:在
TASK_AGE_EXPEDITE_OSD尝试失败后加快处理 - 一般任务:在
TASK_AGE_EXPEDITE_COUNT一段时间后加快处理
任务初始化和配置
系统初始化
任务初始化在系统启动过程中分两个阶段进行:

动态任务管理
任务可以在运行时动态启用、禁用和重新调度:
| 功能 | 目的 | 用法 |
|---|---|---|
setTaskEnabled(taskId, enabled) |
启用/禁用任务执行 | 功能激活/停用 |
rescheduleTask(taskId, newPeriodUs) |
改变任务执行率 | 自适应速率控制 |
getTaskInfo(taskId, &taskInfo) |
获取任务统计信息 | 性能监控 |
schedulerResetTaskStatistics(taskId) |
重置性能计数器 | 统计管理 |