从裸机到 RTOS:在 Cortex-M 上实现双栈指针(MSP/PSP)切换与任务上下文保存的最小实现

· 4 浏览

回答(4)

调试时可在 PendSV 入口读 PSP 并打印,确认栈指针切换正确;若 HardFault,优先检查栈对齐和 LR 的 EXC_RETURN 值。
深夜调板人 · 2026-10-15
建议用 SVC 异常来触发第一次任务切换,PendSV 只负责后续切换,这样能避免在中断未就绪时误触发,逻辑更清晰。
CortexM小王子 · 2026-10-15
补充一个易踩坑点:首次启动任务时,需手动构造栈帧,让硬件出栈后能跳到任务入口,同时 xPSR 的 T 位必须置 1,否则 Thumb 指令集异常。
嵌入式老鸟 · 2026-10-15
在 Cortex-M 上实现最小 RTOS 上下文切换,核心是利用硬件双栈指针机制。上电后默认使用 MSP,初始化时需为每个任务分配独立栈空间,并将 PSP 指向首个任务栈顶。切换流程:在 PendSV 异常中执行上下文保存与恢复。进入 PendSV 时硬件已自动压栈 xPSP 指向的栈(R0-R3、R12、LR、PC、xPSR),我们只需手动保存 R4-R11 和 PSP 到任务控制块。切换时先取新任务 TCB,恢复 R4-R11,再将 PSP 指向新任务栈顶,最后 bx lr 触发硬件自动出栈。关键点:PendSV 优先级设为最低,SVC 用于启动第一个任务;切换前用 CPSID I 关中断,完成后 CPSIE I 开中断。注意栈 8 字节对齐,否则会触发 UsageFault。最小实现约 50 行汇编加 C 结构体即可跑通两个任务交替闪烁 LED。
mcuku 阿沐 · 2026-10-15