60 秒回答模板

FreeRTOS 的调度核心是基于优先级的就绪任务选择。每个任务有状态和优先级,处于 Ready 的任务放在对应优先级的就绪链表中,调度器总是选择最高优先级的就绪任务运行。系统节拍中断会维护 tick 计数,把延时到期的任务或超时等待的任务从阻塞状态移回就绪态;如果出现更高优先级任务就绪,就触发一次上下文切换。Cortex-M 上常见做法是 SysTick 负责节拍,PendSV 负责保存当前任务上下文并恢复下一个任务上下文。是否抢占、同优先级是否时间片轮转取决于配置项。面试里还要强调:任务主动阻塞在队列、信号量、事件组、延时上,才能让 CPU 给其他任务;调度不是线程越多越好,而是优先级、临界区和中断 API 要设计正确。

考点 就绪链表
难度 真实面经题
回答目标 证明自己理解实时任务如何被选择、唤醒和切换,并知道调度配置对行为的影响。

深入解析

01

任务状态决定调度范围

调度器只在就绪任务里选运行者。任务等待时间、队列、信号量或事件时进入阻塞;被挂起时不参与调度;删除后释放资源。理解状态变化比只背抢占式调度更关键。

02

优先级是第一选择条件

每个优先级通常维护一个就绪链表,调度时找最高优先级的非空链表。同优先级任务在启用时间片时轮转,否则运行任务会持续运行到主动阻塞、让出或被更高优先级任务抢占。

03

tick 和事件共同触发切换

节拍中断推动延时和超时;队列发送、信号量释放、中断唤醒等事件也可能让高优先级任务变为就绪。只要需要换出当前任务,内核会设置调度请求,随后执行上下文切换。

04

上下文切换保存任务现场

切换时要保存当前任务栈指针和必要寄存器,恢复新任务的栈和寄存器。Cortex-M 上常把真正切换放到低优先级异常中做,让普通中断尽快返回,降低中断延迟。

易错点

  • 只说抢占式调度,没有讲就绪态、阻塞态和唤醒条件。
  • 认为 tick 是唯一调度触发源,忽略信号量、队列和中断唤醒。
  • 把高优先级任务写成死循环不阻塞,导致低优先级任务永远得不到执行。
  • 在中断里误用普通 API,回答没有区分 ISR 安全接口。

面试官追问

同优先级任务一定会轮流执行吗?

不一定,要看是否启用时间片。即使启用时间片,任务主动阻塞通常比空转等待更合理,否则会浪费 CPU。

中断里能不能直接调用普通任务 API?

通常不能,要使用 FromISR 版本,并通过参数判断是否需要在中断退出后触发调度,避免破坏内核临界区和调度状态。

怎么验证这个 RTOS 方案没有引入新的实时性问题?

要看最坏响应时间、任务优先级、栈水位、队列积压、临界区时长和中断延迟,用压力用例和日志证明正常路径、阻塞路径、异常恢复路径都在预算内。