【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 会打断它,导致串口数据丢失;
- 若多个中断嵌套,切换时机混乱,容易导致任务栈损坏、程序崩溃。
总结
- 核心目的:PendSV 是 Cortex-M 为 “安全的任务切换” 设计的异常,解决了 “中断嵌套下切换任务” 的时机问题;
- 关键机制:通过 “可挂起 + 最低优先级” 的特性,确保任务切换只会在所有高优先级中断处理完成后执行;
- 典型应用:是 RTOS 实现任务调度的核心依赖,几乎所有基于 Cortex-M 的 RTOS 都用 PendSV 完成上下文切换。
简单来说,PendSV 就像一个 “低优先级的调度员”,它不抢活干,只等所有紧急任务(高优先级中断)做完,再安安静静地处理任务切换,保证系统稳定。
CortexM 文章被收录于专栏
cortexm相关
