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 最低。若优先级反转风险存在,例如低优先级任务持有高优先级任务所需信号量,则必须启用优先级继承协议,使低优先级任务临时继承等待者的优先级,避免中优先级任务无限阻塞高优先级任务。
时间片轮转:同优先级任务的公平性
严格优先级调度在任务数量少、优先级层次分明时表现良好,但当多个任务具有相同优先级时,若不做额外处理,先就绪的任务会一直占用 CPU,导致同优先级其他任务饥饿。INTEGRITY 通过时间片轮转解决这一问题:每个任务配置一个时间片长度,当同优先级任务就绪时,调度器按时间片轮流分配 CPU。时间片耗尽后,任务被放回就绪队列尾部,同优先级下一个任务获得执行机会。
时间片长度需要权衡:过短会增加上下文切换开销,过长则降低同优先级任务的响应公平性。以上例中若 NavFilter 与另一个同优先级任务 SensorFusion 共存,时间片设为 3 ms,则两者每 6 ms 各获得一次执行机会。注意,时间片轮转只在同优先级任务之间生效;一旦更高优先级任务就绪,无论当前任务时间片是否用完,都会被立即抢占。
任务间同步与通信机制
任务之间需要交换数据或协调执行顺序,INTEGRITY 提供信号量、消息队列和事件标志三类主要机制。信号量用于互斥访问共享资源,例如两个任务都要读写同一块传感器数据缓冲区时,通过二值信号量保证临界区串行执行。若存在优先级反转风险,应使用支持优先级继承的信号量,使持有信号量的低优先级任务临时提升到等待者的优先级。
消息队列用于任务间异步数据传递。发送任务将消息放入队列后继续执行,接收任务在需要时从队列取出。队列深度和消息大小在配置阶段确定,例如 NavFilter 向 AttitudeCtrl 发送导航修正量,消息结构为 16 字节,队列深度 8。若队列满,发送任务可选择阻塞等待或返回错误,具体策略由配置决定。事件标志则适合多条件同步:一个任务等待多个事件位组合,例如 HealthMon 同时等待“传感器就绪”和“导航收敛”两个事件标志置位后才执行健康评估。
调度行为观察与验证
任务配置完成后,需要验证调度行为是否符合预期。INTEGRITY 提供任务执行时间统计和上下文切换计数等观测手段。例如通过系统调用读取各任务的累计执行时间,若 AttitudeCtrl 每 5 ms 周期内执行时间稳定在 1.2 ms 左右,说明其最坏执行时间未超过预算;若某任务执行时间持续接近或超过其周期,则需检查是否存在阻塞、优先级配置不当或计算量过大。上下文切换次数过高通常意味着时间片过短或任务频繁阻塞唤醒,需要调整时间片或同步策略。
实际工程中,建议在集成阶段先以“单任务独占”方式测量每个任务的最坏执行时间,再按速率单调原则分配优先级,最后加入同步与通信机制后重新测量响应时间。若发现高优先级任务响应时间超出截止时间,应优先检查是否存在优先级反转、中断延迟过长或共享资源竞争,而不是简单提高优先级——提高优先级可能掩盖问题,却无法消除阻塞根源。