4. 任务管理与实时调度

在 INTEGRITY 这类高可靠实时操作系统中,任务管理不是简单的“创建线程然后运行”,而是围绕确定性、可预测性和故障隔离展开的一整套机制。INTEGRITY 采用分区(Partition)与任务(Task)两级结构:分区提供空间与时间隔离,任务则是分区内实际参与调度的执行单元。理解任务管理与实时调度,核心要回答四个问题:任务如何创建、优先级如何决定谁先运行、调度器如何在抢占与时间片之间取舍、任务之间如何安全地同步与通信。

任务创建:从静态配置到运行实体

INTEGRITY 的任务通常在系统构建阶段通过配置表静态定义,而不是在运行时随意动态创建。每个任务在配置中至少需要指定:任务名、所属分区、入口函数、优先级、栈大小、初始状态(挂起或就绪)、时间片长度以及是否允许浮点上下文等属性。静态配置的好处是资源需求在编译期即可分析,避免运行时因内存不足或优先级冲突导致不可预测行为。

以某飞控分区为例,配置中可定义三个任务:AttitudeCtrl(姿态控制,优先级 200,周期 5 ms)、NavFilter(导航滤波,优先级 150,周期 10 ms)、HealthMon(健康监控,优先级 80,周期 50 ms)。优先级数值越大表示越紧急。任务创建后处于就绪或挂起状态,由分区调度器统一管理。任务栈大小需根据最坏情况调用深度估算,例如姿态控制任务若调用矩阵运算库,栈需求可能达到 8 KB 以上,配置不足会导致栈溢出并触发分区异常。

优先级设置与抢占式调度

INTEGRITY 的调度器是严格优先级抢占式调度器。任一时刻,就绪队列中优先级最高的任务获得 CPU。当更高优先级任务从等待事件变为就绪时,调度器立即保存当前任务上下文并切换到高优先级任务,这就是抢占。抢占保证了高紧急度任务的响应时间上界,是实时系统可预测性的基础。

优先级分配应遵循速率单调(Rate Monotonic)思想:周期越短、截止时间越紧的任务,优先级越高。上例中姿态控制周期 5 ms,优先级最高;导航滤波 10 ms 次之;健康监控 50 ms 最低。若优先级反转风险存在,例如低优先级任务持有高优先级任务所需信号量,则必须启用优先级继承协议,使低优先级任务临时继承等待者的优先级,避免中优先级任务无限阻塞高优先级任务。

INTEGRITY 分区内任务调度与同步关系示意 分区 Partition(时间与空间隔离边界) AttitudeCtrl 优先级 200 · 周期 5 ms 栈 8 KB · 时间片 2 ms NavFilter 优先级 150 · 周期 10 ms 栈 12 KB · 时间片 3 ms HealthMon 优先级 80 · 周期 50 ms 栈 4 KB · 时间片 5 ms 严格优先级抢占式调度器 就绪队列最高优先级任务获得 CPU 抢占 信号量 Semaphore 优先级继承 · 互斥访问 消息队列 Message Queue 异步通信 · 数据传递 事件标志 Event Flags 多条件同步 · 广播唤醒 时间片轮转仅在同优先级任务间生效;不同优先级任务之间始终由抢占规则决定

时间片轮转:同优先级任务的公平性

严格优先级调度在任务数量少、优先级层次分明时表现良好,但当多个任务具有相同优先级时,若不做额外处理,先就绪的任务会一直占用 CPU,导致同优先级其他任务饥饿。INTEGRITY 通过时间片轮转解决这一问题:每个任务配置一个时间片长度,当同优先级任务就绪时,调度器按时间片轮流分配 CPU。时间片耗尽后,任务被放回就绪队列尾部,同优先级下一个任务获得执行机会。

时间片长度需要权衡:过短会增加上下文切换开销,过长则降低同优先级任务的响应公平性。以上例中若 NavFilter 与另一个同优先级任务 SensorFusion 共存,时间片设为 3 ms,则两者每 6 ms 各获得一次执行机会。注意,时间片轮转只在同优先级任务之间生效;一旦更高优先级任务就绪,无论当前任务时间片是否用完,都会被立即抢占。

任务间同步与通信机制

任务之间需要交换数据或协调执行顺序,INTEGRITY 提供信号量、消息队列和事件标志三类主要机制。信号量用于互斥访问共享资源,例如两个任务都要读写同一块传感器数据缓冲区时,通过二值信号量保证临界区串行执行。若存在优先级反转风险,应使用支持优先级继承的信号量,使持有信号量的低优先级任务临时提升到等待者的优先级。

消息队列用于任务间异步数据传递。发送任务将消息放入队列后继续执行,接收任务在需要时从队列取出。队列深度和消息大小在配置阶段确定,例如 NavFilter 向 AttitudeCtrl 发送导航修正量,消息结构为 16 字节,队列深度 8。若队列满,发送任务可选择阻塞等待或返回错误,具体策略由配置决定。事件标志则适合多条件同步:一个任务等待多个事件位组合,例如 HealthMon 同时等待“传感器就绪”和“导航收敛”两个事件标志置位后才执行健康评估。

选择同步机制时,先判断通信语义:互斥访问共享资源用信号量;传递数据用消息队列;等待多个条件组合用事件标志。不要用信号量传递数据,也不要用消息队列实现互斥,否则会引入不必要的复杂性和延迟。

调度行为观察与验证

任务配置完成后,需要验证调度行为是否符合预期。INTEGRITY 提供任务执行时间统计和上下文切换计数等观测手段。例如通过系统调用读取各任务的累计执行时间,若 AttitudeCtrl 每 5 ms 周期内执行时间稳定在 1.2 ms 左右,说明其最坏执行时间未超过预算;若某任务执行时间持续接近或超过其周期,则需检查是否存在阻塞、优先级配置不当或计算量过大。上下文切换次数过高通常意味着时间片过短或任务频繁阻塞唤醒,需要调整时间片或同步策略。

实际工程中,建议在集成阶段先以“单任务独占”方式测量每个任务的最坏执行时间,再按速率单调原则分配优先级,最后加入同步与通信机制后重新测量响应时间。若发现高优先级任务响应时间超出截止时间,应优先检查是否存在优先级反转、中断延迟过长或共享资源竞争,而不是简单提高优先级——提高优先级可能掩盖问题,却无法消除阻塞根源。