rtos上下文切换由硬件自动保存r0–r3/r12/lr/xpsr至psp栈,pendsv补全r4–r11并更新tcb中栈指针,异常返回时自动恢复全部寄存器,确保任务断点续执行。

定时器任务执行前后,上下文状态的保持与恢复是RTOS稳定运行的核心保障。它不是简单地“记下再读回”,而是由硬件自动机制与软件协同完成的一套精密流程,确保任务被中断后能准确回到断点继续执行。
定时器中断触发时的上下文自动保存
当SysTick或硬件定时器产生中断,CPU进入中断服务程序前,Cortex-M内核会自动将部分关键寄存器压入当前任务的进程栈(PSP):
- R0–R3、R12:调用者保存寄存器,用于函数传参和临时计算
- LR(链接寄存器):记录中断返回地址,即被中断任务下一条指令的位置
- PC(程序计数器):实际由异常返回机制隐式维护,确保从中断退出后跳回原位置
- xPSR(程序状态寄存器):保存当前处理器模式、条件标志等运行状态
这一步完全由硬件完成,无需软件干预,但依赖于正确配置的栈指针(PSP)和异常向量表。
PendSV中完成完整上下文补全与切换
FreeRTOS等RTOS不直接在定时器ISR中做任务切换,而是触发PendSV异常——一个低优先级、可延迟执行的系统异常。PendSV处理程序负责:
一款AI工具,主要用于在主代理响应前,并行运行Kimi K2.5和GPT 5.3 Codex,注入双方观点以增强认知多样性,适合需要提升相关任务效率的用户。
- 显式执行
PUSH {R4–R11},保存被调用者保存寄存器(这些寄存器在函数调用中需由被调用方保护) - 将更新后的栈顶指针(PSP)写入当前任务的TCB(任务控制块),完成“栈与任务”的绑定
- 调用
vTaskSwitchContext()选择下一个最高优先级就绪任务 - 从新任务TCB中加载其PSP值,并执行
POP {R4–R11}恢复寄存器
此时,硬件在异常返回时自动弹出R0–R3、R12、LR、xPSR,PC也同步恢复,整个任务就像从未被打断过一样继续执行。
栈空间与TCB是上下文的物理载体
上下文本身没有独立内存,它分散存储在两个地方:
- 任务栈:存放所有寄存器快照、局部变量、函数调用帧。每个任务必须分配足够大的栈空间,否则压栈溢出会导致不可预测行为
- TCB结构体:仅保存关键锚点信息,主要是栈顶指针(pxTopOfStack字段),有时还包括任务状态、优先级等调度元数据
初始化任务时,RTOS会预先在栈底填入初始上下文(如xPSR=0x01000000表示线程模式+Thumb状态,PC设为任务函数入口,LR设为任务退出处理函数),使任务首次运行时能正常启动。
常见陷阱与注意事项
实际开发中,上下文恢复失败往往不是代码逻辑错误,而是底层配置疏漏:
- 未正确设置PSP(而非MSP)作为当前任务栈指针,导致寄存器压入错误栈区
- 中断优先级配置不当,使PendSV被更高优先级中断抢占,破坏原子性
- 任务栈尺寸不足,在深度函数调用或中断嵌套时发生溢出
- 在中断服务程序中直接调用非临界安全的RTOS API(如
xQueueSendFromISR未配对使用portYIELD_FROM_ISR)










