1. 寄存器
mrs // 用来读取特殊寄存器的值
msr // 用来写入特殊寄存器的值
1.1 程序状态寄存器
1.2 PRIMASK, FAULTMASK 和 BASEPRI
1.3 控制寄存器
控制寄存器用于定义特权级别,还用于选择当前使用哪个堆栈指针。
2.操作模式
Cortex‐M3 支持 2 个模式和两个特权等级
当处理器处在线程状态下时,既可以使用特权级,也可以使用用户级;另一方面, handler模式总是特权级的。在复位后,处理器进入线程模式+特权级。在线程模式+用户级下,对系统控制空间( SCS)的访问将被阻止——该空间包含了配置寄存器 s 以及调试组件的寄存器 s。除此之外,还禁止使用 MSR 访问刚才讲到的特殊功能寄存器——除了 APSR 有例外。谁若是以身试法,则将 fault 伺候。
在特权级下的代码可以通过置位 CONTROL[0]来进入用户级。而不管是任何原因产生了任何异常,处理器都将以特权级来运行其服务例程,异常返回后将回到产生异常之前的特权级。用户级下的代码不能再试图修改 CONTROL[0]来回到特权级。它必须通过一个异常 handler,由那个异常 handler 来修改 CONTROL[0],才能在返回到线程模式后拿到特权级。
2.1 异常返回值
前面已经讲到,在进入异常服务程序后, LR的值被自动更新为特殊的EXC_RETURN,这是一个高28位全为1的值,只有[3:0]的值有特殊含义,如表9.3所示。当异常服务例程把这个值送往PC时,就会启动处理器的中断返回序列。因为LR的值是由CM3自动设置的,所以只要没有特殊需求,就不要改动它。