【CortexM】PendSV

PendSV

PendSV(Pendable Service Call)(可挂起的系统调用)是 Cortex-M 内核特有的一种可配置优先级的系统异常,它的设计初衷是解决嵌入式系统中 “中断 / 异常嵌套” 和 “任务切换” 的核心痛点

进入 PendSV 异常时,硬件会自动保存部分寄存器(R0-R3、R12、LR、PC、xPSR)到栈中,退出时自动恢复,完美适配任务上下文切换的需求。

核心问题:中断上下文的安全切换

在没有 PendSV 之前,如果直接在中断服务函数(ISR)中触发任务切换,会存在两个致命问题:

  • 高优先级中断正在执行时,强行切换任务会打断关键的硬件操作(如串口 / 总线通信),导致数据错误;
  • 多个中断嵌套时,切换时机不可控,容易引发栈溢出、上下文混乱。

PendSV 的核心解决思路是:把 “任务切换” 这个操作延迟到 “所有高优先级中断处理完成后” 执行,确保切换时机的安全性。

 实际应用场景(易懂的例子)

  • SysTick 中断(定时器):优先级较高,负责触发任务调度,但它只做 “标记”(挂起 PendSV),不直接执行切换;
  • PendSV 异常:优先级最低,等 SysTick 和所有高优先级中断执行完后,才执行实际的任务切换,确保切换时系统处于 “空闲” 状态

没有 PendSV 会怎样?

如果不用 PendSV,直接在 SysTick 中断中切换任务:

  • 若此时有更高优先级的中断(如串口接收)正在执行,SysTick 会打断它,导致串口数据丢失;
  • 若多个中断嵌套,切换时机混乱,容易导致任务栈损坏、程序崩溃。

总结

  1. 核心目的:PendSV 是 Cortex-M 为 “安全的任务切换” 设计的异常,解决了 “中断嵌套下切换任务” 的时机问题;
  2. 关键机制:通过 “可挂起 + 最低优先级” 的特性,确保任务切换只会在所有高优先级中断处理完成后执行;
  3. 典型应用:是 RTOS 实现任务调度的核心依赖,几乎所有基于 Cortex-M 的 RTOS 都用 PendSV 完成上下文切换。

简单来说,PendSV 就像一个 “低优先级的调度员”,它不抢活干,只等所有紧急任务(高优先级中断)做完,再安安静静地处理任务切换,保证系统稳定。

CortexM 文章被收录于专栏

cortexm相关

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务