在 Cortex-M3/M4 处理器中,Thread Mode 和 Handler Mode 是两种核心操作模式,它们与 访问级别(特权级/用户级) 和 堆栈指针(MSP/PSP) 的关系密切,直接影响代码执行权限和内存访问控制。以下是详细总结:
1. 操作模式(Operation Modes)
(1) Thread Mode
- 用途:执行普通应用程序代码(如用户任务、非中断代码)。
- 访问级别:
- 默认:特权级(Privileged),可访问所有硬件资源。
- 可切换:通过
CONTROL
寄存器可降级为用户级(Unprivileged),限制敏感操作。
- 堆栈指针:
- 特权级 Thread Mode:可自由选择 MSP(主堆栈)或 PSP(进程堆栈)。
- 用户级 Thread Mode:强制使用 PSP(增强安全性)。
(2) Handler Mode
- 用途:处理异常或中断(如HardFault、SysTick、外部中断)。
- 访问级别:
- 固定为特权级,不可配置(确保异常处理能访问所有资源)。
- 堆栈指针:
- 固定使用 MSP(主堆栈),保证中断响应的高效性和可靠性。
2. 访问级别(Privilege Levels)
级别 | 权限 | 适用模式 |
---|---|---|
特权级 | 可访问所有寄存器和内存(如 MSR/MRS 指令、NVIC配置)。 | Handler Mode(强制) Thread Mode(默认或配置) |
用户级 | 仅能访问非特权资源,禁止操作关键寄存器(如 CONTROL 、NVIC)。 | Thread Mode(需主动配置) |
切换规则:
- 用户级 → 特权级:必须通过触发异常(如
SVC
指令)进入 Handler Mode。 - 特权级 → 用户级:直接修改
CONTROL
寄存器(需当前为特权级)。
3. 堆栈指针(MSP 和 PSP)
Cortex-M3/M4 提供两个独立的堆栈指针:
- MSP(Main Stack Pointer):默认堆栈,用于异常处理和特权级代码。
- PSP(Process Stack Pointer):可选堆栈,通常用于用户级任务(如RTOS中的任务)。
堆栈指针的分配规则:
模式 | 访问级别 | 使用的堆栈指针 | 说明 |
---|---|---|---|
Thread Mode | 特权级 | MSP 或 PSP(可配置) | 由 CONTROL[1] (SPSEL)决定:0 =MSP(默认),1 =PSP。 |
Thread Mode | 用户级 | PSP(强制) | 用户级任务必须使用 PSP,与内核/异常隔离。 |
Handler Mode | 特权级(强制) | MSP(强制) | 所有异常处理统一使用 MSP,确保响应速度和安全。 |
关键寄存器:
CONTROL
寄存器:- Bit 0 (nPRIV):定义 Thread Mode 的访问级别(
0
=特权,1
=用户)。 - Bit 1 (SPSEL):选择 Thread Mode 的堆栈指针(
0
=MSP,1
=PSP)。- 注意:用户级 Thread Mode 下,
SPSEL
必须为1
(强制使用 PSP)。
- 注意:用户级 Thread Mode 下,
- Bit 0 (nPRIV):定义 Thread Mode 的访问级别(
4. 典型应用场景
(1) 裸机系统(无OS)
- Thread Mode:保持特权级,默认使用 MSP。
- Handler Mode:中断处理使用 MSP。
- 无需 PSP:除非需要分离用户代码和内核堆栈。
(2) RTOS(带操作系统)
- 用户任务:运行在 Thread Mode 用户级,使用 PSP。
- 内核/异常:运行在 Handler Mode 特权级,使用 MSP。
- 任务切换:通过
PendSV
异常(Handler Mode)修改 PSP,实现上下文切换。
5. 模式切换流程示例
- 复位启动:
- 进入 Thread Mode,特权级,使用 MSP。
- 任务配置:
- 在特权级下,设置
CONTROL
寄存器:<
- 在特权级下,设置