真实面经题目 · 原创解析
FreeRTOS 如何实现任务调度?
这题考实时内核调度机制,回答要把优先级就绪链表、节拍中断、阻塞唤醒和上下文切换串起来。
真实面经题目 · 原创解析
这题考实时内核调度机制,回答要把优先级就绪链表、节拍中断、阻塞唤醒和上下文切换串起来。
FreeRTOS 的调度核心是基于优先级的就绪任务选择。每个任务有状态和优先级,处于 Ready 的任务放在对应优先级的就绪链表中,调度器总是选择最高优先级的就绪任务运行。系统节拍中断会维护 tick 计数,把延时到期的任务或超时等待的任务从阻塞状态移回就绪态;如果出现更高优先级任务就绪,就触发一次上下文切换。Cortex-M 上常见做法是 SysTick 负责节拍,PendSV 负责保存当前任务上下文并恢复下一个任务上下文。是否抢占、同优先级是否时间片轮转取决于配置项。面试里还要强调:任务主动阻塞在队列、信号量、事件组、延时上,才能让 CPU 给其他任务;调度不是线程越多越好,而是优先级、临界区和中断 API 要设计正确。
调度器只在就绪任务里选运行者。任务等待时间、队列、信号量或事件时进入阻塞;被挂起时不参与调度;删除后释放资源。理解状态变化比只背抢占式调度更关键。
每个优先级通常维护一个就绪链表,调度时找最高优先级的非空链表。同优先级任务在启用时间片时轮转,否则运行任务会持续运行到主动阻塞、让出或被更高优先级任务抢占。
节拍中断推动延时和超时;队列发送、信号量释放、中断唤醒等事件也可能让高优先级任务变为就绪。只要需要换出当前任务,内核会设置调度请求,随后执行上下文切换。
切换时要保存当前任务栈指针和必要寄存器,恢复新任务的栈和寄存器。Cortex-M 上常把真正切换放到低优先级异常中做,让普通中断尽快返回,降低中断延迟。
不一定,要看是否启用时间片。即使启用时间片,任务主动阻塞通常比空转等待更合理,否则会浪费 CPU。
通常不能,要使用 FromISR 版本,并通过参数判断是否需要在中断退出后触发调度,避免破坏内核临界区和调度状态。
要看最坏响应时间、任务优先级、栈水位、队列积压、临界区时长和中断延迟,用压力用例和日志证明正常路径、阻塞路径、异常恢复路径都在预算内。