Cortex-M3和Cortex-M4处理器有两种操作状态和两个模式。处理器还可以区分特权和非特权访问等级。
1、CPU模式
- 处理模式:执行中断服务程序(ISR)等异常处理,在处理模式下,处理器总是具有特权访问等级。
- 线程模式:在执行普通的应用程序代码时,处理器可以处于特权访问等级,也可处于非特权访问等级。实际的访问等级由特殊寄存器CONTROL控制。
2、操作状态
- 调试状态:当处理器被暂停后(例如,通过调试器或触发断电后),就会进入调试状态,并停止指令执行。
- Thumb状态:处理器在执行程序代码(THumb指令),他就会处于Thumb状态。Cortex-M处理器不支持ARM指令,所以ARM状态不存在。

3、CONTROL寄存器
CONTROL寄存器定义了:
- 栈指针的选择(主栈指针/进程栈指针)。
- 线程模式的访问等级(特权/非特权)。
- 当下上下文(正在执行的代码)是否使用浮点单元。(具有浮点单元的Cortex-M4处理器)
3.1、CONTROL寄存器位域


3.2、栈指针的选择
- 复位后,CONTROL寄存器默认为0,所以处理器此时处于线程模式、具有特权访问权限、使用主栈指针。
- 特权线程模式的程序可以通过写CONTROL寄存器切换栈指针或进入非特权访问等级,
- 运行在线程模式的程序不能访问CONTROL寄存器

3.3、如何进入特权访问等级
运行在非特权等级的程序无法在切换会特权访问等级,如果需要切换至特权访问等级,需要使用异常机制。发生异常时,程序处于处理模式、特权访问等级,此时可以此时可以清除nPRIV位,返回线程模式后,处理起就会进入特权访问等级。

3.4、nPRIV和SPSEL的四种组合方式

3.5、设置CONTROL寄存器
C语言:使用CMSIS的设备驱动库提供的函数
x = _get_CONTROL(); /* 读取CONTROL寄存器的当前值 */ _set_CONTROL(x); /* 设置CONTROL寄存器的数值为x */
汇编:
MRS r0, CONTROL ;将CONTROL寄存器读r0 MSR CONTROL, r0 ;将r0写入CONTROL寄存器