STM32的线程模式(Thread Mode)和内核模式(Handler Mode)以及其对应的权级和堆栈指针
线程模式:
正常代码执行时的模式(如 main 函数、FreeRTOS任务)
可以是特权级(使用MSP)也可以是非特权级(使用PSP)
异常模式:
正在执行中断服务程序
永远是特权级,使用MSP
模式 | 栈指针 | 特权级 | 应用场景 |
---|---|---|---|
线程模式 | MSP | 特权级 | 系统启动初期 |
线程模式 | PSP | 非特权级 | RTOS用户任务 |
内核模式 | MSP | 特权级 | 中断服务程序、系统调用处理 |
在RAM上的分布情况
text
地址 ↓ 增大 (低 → 高) 物理地址范围
┌──────────────────────────────┐
│ RAM 结束 │ 0x2002_0000
├──────────────────────────────┤
│ MSP 栈区 │← 异常模式、中断使用
│ (Main Stack Pointer) │
│ ↓ 向下增长 │
├──────────────────────────────┤
│ PSP - 任务A 栈 │← 任务A执行时使用
│ (Process Stack Pointer) │
│ ↓ 向下增长 │
├──────────────────────────────┤
│ PSP - 任务B 栈 │← 任务B执行时使用
│ ↓ 向下增长 │
├──────────────────────────────┤
│ PSP - 任务C 栈 │← 任务C执行时使用
│ ↓ 向下增长 │
├──────────────────────────────┤
│ 全局变量区 │
│ BSS / DATA段等 │
├──────────────────────────────┤
│ 堆(heap)区 │↑ 向上增长
├──────────────────────────────┤
│ RAM 起始地址 │ 0x2000_0000
└──────────────────────────────┘
RTOS任务如何从MSP切换到PSP?SVC_Handler 起到什么作用?
待写