ARMV7架构学习(5)--处理器模式与特权访问等级

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寄存器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值