1 操作模式
在讨论PendSV和SVC异常前,需要先了解Cortex-M的模式和两个特权等级。
Figure 1 1 操作模式和特权等级
两种模式为handler模式和线程(thread)模式,这两种模式是为了区别正在执行代码的类型;handler模式为异常处理例程的代码;线程模式为普通应用程序的代码。
两种特权级包括特权级和用户级,两种特权级别是对存储器访问提供的一种保护机制,然后用户代码不能访问特定的存储区域;在特权级下,程序可以访问所有范围的存储器(如果有MPU,还要在MPU的禁地之外),并且能够执行所有指令;在用户级下,不能访问系统控制空间(SCS,包含配置寄存器及调试组件的寄存器),且禁止使用MSR访问特殊功能寄存器(APSR除外),如果访问,则产生fault,具体地说就是MPU,NVIC,SCB和STK四个单元不能访问。
在线程模式,可以是特权级,也可以是用户级;handler模式总是特权级的;在复位后,处理器处于线程模式+特权级。
在特权级下的代码可以通过置位CONTROL[0]来进入用户级。而不管是任何原因产生了任何异常,处理器都将以特权级来运行其服务例程,异常返回后将回到产生异常之前的特权级。用户级下的代码无法直接修改CONTROL[0]来回到特权级,它必须通过一个异常handler,由那个异常handler 来修改CONTROL[0],才能在返回到线程模式后拿到特权级。