真实面经题目 · 原创解析
FreeRTOS 上下文切换为什么常用 SysTick 和 PendSV?
这题考 Cortex-M 上实时内核切换机制,回答要说明 SysTick 负责时间节拍和唤醒,PendSV 以低优先级执行上下文保存恢复。
真实面经题目 · 原创解析
这题考 Cortex-M 上实时内核切换机制,回答要说明 SysTick 负责时间节拍和唤醒,PendSV 以低优先级执行上下文保存恢复。
常见 Cortex-M 移植里,SysTick 用作系统节拍,每隔固定周期进入中断,递增 tick,检查延时列表,把到期任务移回就绪态。如果因此出现更高优先级任务就绪,就不在 SysTick 里直接做完整切换,而是挂起 PendSV。PendSV 通常设置为最低异常优先级,等当前中断和更高优先级中断都处理完后再运行,在里面保存当前任务上下文、更新 TCB 的栈指针、选择下一个任务、恢复它的上下文并返回。这样做的好处是把时间管理和真正上下文切换解耦,避免在高优先级中断里做耗时切换,降低中断延迟,也让多个中断引发的调度请求合并成一次 PendSV。SVC 常用于启动第一个任务或主动系统调用,SysTick 和 PendSV 配合完成周期调度。
延时、超时和时间片都需要 tick 推进。SysTick 中断更新内核时间,并判断是否有任务因延时到期或时间片耗尽而需要重新调度。
上下文切换要保存和恢复寄存器、栈指针和任务控制块,操作相对重。把它放到 PendSV 中做,可以统一处理从 tick、中断唤醒或主动 yield 产生的切换请求。
PendSV 设为最低优先级,保证外设中断先完成,再进行任务切换。这样不会因为调度器切换现场而拉长高优先级中断响应。
Cortex-M 异常机制会自动保存部分寄存器,PendSV 再保存软件负责的寄存器和当前 PSP,切换到下一个任务的栈后,通过异常返回恢复执行。
可以实现,但会让节拍中断承担较重工作,并可能影响其他中断延迟。PendSV 低优先级统一切换更清晰。
时间片和延时超时会受影响,但任务仍可能通过中断、信号量或主动 yield 触发调度,具体取决于系统配置和 tickless 设计。
要看最坏响应时间、任务优先级、栈水位、队列积压、临界区时长和中断延迟,用压力用例和日志证明正常路径、阻塞路径、异常恢复路径都在预算内。