Cortex-M处理器操作模式、特权等级和栈指针
操作模式
- 处理模式:执行中断服务程序等异常处理,处理器具有特权访问等级
- 线程模式:执行普通的应用程序代码,处理器处于的访问特权等级不一定
如果想完成线程模式下的访问等级由非特权访问等级,变为特权访问等级需要使用异常机制
栈指针
栈指针分为MSP主栈指针和PSP进程栈指针,用到FreeRTOS等操作系统时才会用到PSP。
CONTROL寄存器
栈指针的选择和线程模式的访问等级依靠CONTROL寄存器实现。
功能 | |
---|---|
CONTROL[0]nPRIV | 定义线程模式特权等级 0 = 特权级的线程模式(默认) 1 = 用户级的线程模式 |
CONTROL[1]SPSEL | 定义栈指针 0 = 选择主堆栈指针MSP(默认) 1 = 选择进程堆栈指针PSP |
Handler处理模式永远都是特权级的,Handler处理模式下只允许使用MSP。
异常压栈时的SP指针
线程模式下,使用MSP,压栈时使用MSP.
线程模式下,使用PSP,压栈时使用PSP.
处理模式下,全部使用PSP,因此嵌套中断的压栈都是使用PSP
Cortex-A 处理器运行模型
运行模型
USR | 用户模式,用户程序运行在User模式下,非特权模式拥有受限的系统资源访问权限 |
FIQ | 快速中断模式,发生FIQ中断时的进入这个模式,拥有更高的响应等级和更低的延迟 |
IRQ | 一般中断异模式,发生IRQ中断时进入这个模式 |
SVC | 管理员模式,操作系统内核通常运行在该模式下,应用程序发生系统调用svc指令进入这个模式 |
Abort(ABT) | 异常终止模式,当发生数据访问异常的时候进入这个模式 |
System(SYS) | 系统模式,特权模式,一般用来设置USR模式的寄存器 |
Undefined(UND) | 未定义指令模式,执行未定义指令时进入这个模式。 |
Monitor(MON) | 监视模式,用于安全扩展模式,比如TF-A |
Hyp | 虚拟化扩展的处理器才有该模式 |
寄存器组
-
除了FIQ模式,其它模式共用R0-R12,FIQ有自己R8-R12,所以比IRQ模式更快。
-
处理器模式是由状态寄存器CPSR的M域来控制的。对于用户模式而言,是没有权限操作CPSR寄存器的M域的,只能通过svc指令进入到SVC模式。
-
系统模式和用户模式共享寄存器视图,可以在处理器启动时通过设置系统模式的SP寄存器来达到设置用户模式堆栈的目的,要设置用户模式的其他寄存器也可以这样操作