MCU MSP/PSP 上下文切换(完整上电流程)

🔹 完整流程:上电复位 → 向量表加载 → 裸机运行 → RTOS启动 → 中断切换 → 恢复运行 | 🔹 核心:寄存器初始值来自硬件/向量表

📌 核心调度者分工(从复位到任务运行)

硬件复位逻辑 「初始化者」:上电后自动读取向量表,加载MSP初始值、PC复位地址(无代码干预)
硬件内核 「执行者」:复位后初始化通用寄存器、中断时压栈/出栈、切换MSP/PSP
NVIC 「中断调度员」:管理中断优先级,触发内核执行上下文切换
RTOS内核 「任务调度员」:在中断中修改PSP值,切换任务栈(改指针指向的RAM地址)

CPU 核心寄存器(从复位初始值到运行值)

R0 0x00 通用寄存器
R1 0x00 通用寄存器
LR 0xFFFF 返回地址
PC 0x08000000 指令地址
MSP 0x00 主栈指针
PSP 0x00 进程栈指针
PSR 0x00 状态寄存器

RAM 主栈(MSP 指向)

归属:硬件复位/内核/NVIC
栈底 (0x200010C0)
0x20001090
0x20001060
0x20001030
0x20001000
0x20000FD0
0x20000FA0
0x20000F70
0x20000F40
0x20000F10
0x20000EE0
0x20000EB0
栈顶 (0x20000E80)
⬆️ MSP
控制者:硬件复位逻辑

RAM 进程栈(PSP 指向)

归属:RTOS/应用任务
栈底 (0x200020C0)
0x20002090
0x20002060
0x20002030
0x20002000
0x20001FD0
0x20001FA0
0x20001F70
0x20001F40
0x20001F10
0x20001EE0
0x20001EB0
栈顶 (0x20001E80)
⬆️ PSP
控制者:未激活(RTOS启动后接管)
核心溯源:上电复位 → MSP从向量表0x08000000加载初始值 | 通用寄存器初始值=硬件默认0x00 | PSP初始值=0(RTOS启动后赋值)

执行日志(完整上电流程)

⚡️ 初始状态:MCU未上电 → 所有寄存器值为随机值/0,RAM未初始化,无栈指针指向