60 秒回答模板

常见 Cortex-M 移植里,SysTick 用作系统节拍,每隔固定周期进入中断,递增 tick,检查延时列表,把到期任务移回就绪态。如果因此出现更高优先级任务就绪,就不在 SysTick 里直接做完整切换,而是挂起 PendSV。PendSV 通常设置为最低异常优先级,等当前中断和更高优先级中断都处理完后再运行,在里面保存当前任务上下文、更新 TCB 的栈指针、选择下一个任务、恢复它的上下文并返回。这样做的好处是把时间管理和真正上下文切换解耦,避免在高优先级中断里做耗时切换,降低中断延迟,也让多个中断引发的调度请求合并成一次 PendSV。SVC 常用于启动第一个任务或主动系统调用,SysTick 和 PendSV 配合完成周期调度。

考点 职责拆分
难度 真实面经题
回答目标 说明自己理解 Cortex-M 异常机制如何支撑实时内核任务切换。

深入解析

01

SysTick 提供时间基准

延时、超时和时间片都需要 tick 推进。SysTick 中断更新内核时间,并判断是否有任务因延时到期或时间片耗尽而需要重新调度。

02

PendSV 专门做切换

上下文切换要保存和恢复寄存器、栈指针和任务控制块,操作相对重。把它放到 PendSV 中做,可以统一处理从 tick、中断唤醒或主动 yield 产生的切换请求。

03

低优先级避免阻塞紧急中断

PendSV 设为最低优先级,保证外设中断先完成,再进行任务切换。这样不会因为调度器切换现场而拉长高优先级中断响应。

04

切换由异常返回完成

Cortex-M 异常机制会自动保存部分寄存器,PendSV 再保存软件负责的寄存器和当前 PSP,切换到下一个任务的栈后,通过异常返回恢复执行。

易错点

  • 把 SysTick 和 PendSV 都说成定时器中断,不区分职责。
  • 不提 PendSV 低优先级,解释不了为什么中断延迟可控。
  • 认为每次 SysTick 都一定切换任务,忽略只有需要调度时才切换。
  • 不会说上下文保存到各自任务栈和 TCB 中。

面试官追问

为什么不在 SysTick 里直接切换?

可以实现,但会让节拍中断承担较重工作,并可能影响其他中断延迟。PendSV 低优先级统一切换更清晰。

SysTick 停了调度就完全停了吗?

时间片和延时超时会受影响,但任务仍可能通过中断、信号量或主动 yield 触发调度,具体取决于系统配置和 tickless 设计。

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

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