3. VxWorks内核架构与任务管理
VxWorks 的实时能力核心来自 Wind 内核。与通用操作系统“尽量公平地分配 CPU”不同,Wind 内核的设计目标是可预测:在给定优先级和系统负载下,最高优先级就绪任务必须在确定的时间内获得 CPU。理解这一点,是后续所有航空航天多任务设计的基础。
Wind 内核的调度机制
Wind 内核采用基于优先级的抢占式调度,并在此基础上提供同优先级时间片轮转作为可选补充。系统共支持 256 个优先级,数值越小优先级越高:0 为最高,255 为最低。任务创建时通过 taskSpawn 的第二个参数指定优先级。
调度决策发生在两个时刻:一是任务状态发生变化(就绪、阻塞、挂起、删除)时;二是时钟中断触发时间片到期时。Wind 内核维护一个就绪队列,当更高优先级任务进入就绪态,内核立即保存当前任务上下文并切换到高优先级任务,这就是“抢占”。抢占延迟由内核不可抢占区间的长度决定,因此实时设计中应尽量缩短中断服务程序和内核锁的持有时间。
时间片轮转只在同优先级任务之间生效。若多个任务优先级相同且都就绪,内核按时间片依次调度;若某任务在时间片内主动阻塞,则立即让出 CPU。需要注意:时间片轮转会引入额外的调度抖动,在硬实时航空航天场景中,通常让关键任务独占优先级,避免依赖时间片。
任务创建、删除、挂起与恢复
任务创建使用 taskSpawn,它一次性完成栈分配、任务控制块初始化和就绪入队。典型调用如下:
/* 创建飞控姿态解算任务:优先级 50,栈 8KB */
TASK_ID attTaskId = taskSpawn(
"tAttitude", /* 任务名 */
50, /* 优先级:数值小者优先 */
VX_FP_TASK, /* 选项:使用浮点单元 */
8192, /* 栈大小(字节) */
(FUNCPTR)attitudeTask, /* 入口函数 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
if (attTaskId == ERROR) {
logMsg("attitude task spawn failed\n", 0,0,0,0,0,0);
}
任务删除使用 taskDelete,它会释放任务控制块和栈资源。若删除的任务持有互斥量或正在写共享数据,可能造成资源泄漏或数据不一致,因此删除前应先确保任务处于安全点。挂起与恢复分别使用 taskSuspend 和 taskResume:挂起使任务从就绪或阻塞态进入挂起态,恢复则回到就绪态。挂起常用于故障隔离——例如某传感器任务异常时先挂起它,避免其继续污染数据总线。
任务优先级与状态迁移
Wind 任务有四个基本状态:就绪(READY)、运行(RUNNING)、阻塞(PEND)、挂起(SUSPEND)。阻塞通常由 semTake、msgQReceive 等调用引起,等待资源或消息;挂起则由 taskSuspend 显式触发。一个任务可以同时处于“阻塞且挂起”的复合状态,恢复时需先解除挂起,再满足阻塞条件才能回到就绪。
优先级在运行期可动态调整,使用 taskPrioritySet。在航空航天系统中,常用“优先级继承”来抑制优先级反转:当低优先级任务持有高优先级任务所需的互斥量时,临时提升低优先级任务的优先级,使其尽快释放资源。VxWorks 的互斥量(semMCreate)支持优先级继承选项 SEM_INVERSION_SAFE。
航空航天多任务设计案例
以一个简化的卫星姿态控制软件为例,系统包含四类任务:姿态解算(优先级 50)、控制律计算(优先级 55)、执行机构驱动(优先级 60)、遥测打包(优先级 100)。姿态解算与控制律构成强实时链路,必须保证周期性执行;遥测打包为软实时,允许被抢占。
设计要点如下:第一,姿态解算任务通过 taskDelay 实现 10 ms 周期,周期到达后立即运行;第二,控制律任务等待姿态解算任务通过二进制信号量释放的“数据就绪”事件,避免忙等;第三,执行机构驱动任务优先级略低于控制律,保证控制输出先于驱动更新;第四,遥测任务使用消息队列接收各任务发布的遥测帧,队列满时丢弃最旧数据而非阻塞生产者。
共享数据(如姿态四元数)通过互斥量保护,并启用优先级继承。若姿态解算任务在写数据时被遥测任务抢占,而遥测任务又等待同一互斥量,优先级继承会将遥测任务临时提升到姿态解算任务的优先级,避免中间优先级任务无限期阻塞高优先级链路。
taskSpawn 选项不设 VX_ROUND_ROBIN),以减少调度抖动。判断多任务设计是否达标,可观察三个指标:关键任务周期抖动是否在允许范围内(例如 10 ms 周期抖动小于 200 μs);高优先级任务从事件触发到开始执行的延迟是否稳定;系统在满负载下是否仍能保证最高优先级任务按时运行。若抖动明显增大,应检查是否有低优先级任务长时间占用 CPU、中断服务程序过长或互斥量竞争激烈。