LiteOS Cortex-M 内核移植:中断向量表与 PendSV 上下文切换

Cortex-M 异常压栈结构

当发生中断或触发 PendSV 异常切换任务时,Cortex-M 硬件自动压栈与软件手动保存的寄存器帧顺序如下:

栈帧区域保存方式寄存器列表栈顶偏移说明
硬件压栈帧 (8 Words)异常进入时硬件自动压入 PSPxPSR, 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|多级分类工作流:像管理本地代码库一样组织技术笔记]]。