LiteOS Cortex-M 内核移植:中断向量表与 PendSV 上下文切换
Cortex-M 异常压栈结构
当发生中断或触发 PendSV 异常切换任务时,Cortex-M 硬件自动压栈与软件手动保存的寄存器帧顺序如下:
| 栈帧区域 | 保存方式 | 寄存器列表 | 栈顶偏移说明 |
|---|---|---|---|
| 硬件压栈帧 (8 Words) | 异常进入时硬件自动压入 PSP | xPSR, PC, LR, R12, R3, R2, R1, R0 | 开启 FPU 惰性压栈时,额外包含 S0~S15, FPSCR |
| 软件保存帧 (8 Words) | 在 PendSV_Handler 中由汇编保存 | R11, R10, R9, R8, R7, R6, R5, R4 | 紧随硬件栈帧向下增长,任务控制块 TCB->sp 指向栈顶 |
PendSV 任务上下文切换时序
sequenceDiagram
participant SysTick as SysTick / 任务阻塞
participant NVIC as NVIC 中断控制器
participant PendSV as PendSV_Handler (最低优先级)
participant TCB as 任务控制块 (g_losTask)
SysTick->>NVIC: 触发调度请求 (置位 ICSR.PENDSVSET)
NVIC->>PendSV: 高优先级外部中断处理完毕后进入
PendSV->>TCB: MRS R0, PSP 获取旧任务栈指针
PendSV->>TCB: STMFD R0!, {R4-R11} 保存非易失寄存器
PendSV->>TCB: 更新 g_losTask.runTask = g_losTask.newTask
PendSV->>PendSV: LDMFD R0!, {R4-R11} 恢复新任务寄存器
PendSV->>NVIC: MSR PSP, R0 并执行 BX LR 返回线程模式
关联笔记
- 交叉编译工具链与构建目标配置见 [[工程工具链/CMake/modern-cmake-targets|现代 CMake 构建规范:Target 依赖传递与多配置工程组织]]。
- 仓库目录结构约定见 [[知识库指南/快速上手/obsidian-workflow|多级分类工作流:像管理本地代码库一样组织技术笔记]]。
出链引用 (Outgoing Links) 2
反向链接 (Backlinks) 2