2.3 处理器操作模式
ARM Cortex-M3支持两个特权模式(异常模式、线程模式)和两个特权等级(特权级),如图2.3所示。在嵌入式系统应用程序中,程序代码涉及异常代码和非异常代码,这些代码可以工作在特权模式下,也可以工作在用户模式下,但有区别。当处理器处在线程模式下时,既可以使用特权模式,也可以使用用户模式;另外,异常模式总是使用特权模式的。在复位后,处理器进入线程模式加特权模式。
在线程模式加用户模式下,对系统控制空间(SCS,0xE000E000~0xE000EFFF,包括NVIC、SysTick、MPU以及代码调试控制所用的寄存器)的访问将被禁止。除此之外,还禁止使用MRS/MSR指令访问除APSR之外的特殊功能寄存器。若进行访问操作,则对于访问特殊功能寄存器的访问操作被忽略,而对于访问SCS空间的访问操作将产生错误。

图2.3 操作模式和特权模式
在特权模式下,不管任何原因产生了任何异常,处理器都将以特权模式来运行其服务例程。异常返回后,系统将回到产生异常时所处的模式,同时特权模式也可通过置位CONTROL[0]来进入用户模式。用户模式下的代码不能再试图修改CONTROL[0]来回到特权模式。它必须通过一个异常来修改CONTROL[0],才能在返回到线程模式后进入特权模式。处理器模式转换图如图2.4所示。

图2.4 处理器模式转换图
把代码按特权模式和用户模式分开处理,有利于使ARM Cortex-M3的架构更加稳定可靠。例如,当某个用户程序代码出问题时,可防止处理器对系统造成更大的危害,因为用户模式的代码禁止写特殊功能寄存器和NVIC中的寄存器。另外,如果还配有MPU,保护力度就更大,甚至可以阻止用户代码访问不属于它的内存区域。
在引入了嵌入式实时操作系统后,为了避免系统堆栈因应用程序的错误使用而被毁坏,我们可以给应用程序专门配一个堆栈,不让它共享操作系统内核的堆栈。在这种管理制度下,运行在线程模式下的用户代码使用PSP,而异常程序则使用MSP。这两个堆栈指针的切换是智能且全自动的,在异常服务的始末由ARM Cortex-M3硬件处理。(https://www.daowen.com)
如前所述,特权模式和堆栈指针的选择均由CONTROL寄存器负责。
当CONTROL[0] =0时,在异常处理的始末,只发生了处理器模式的转换,中断前后的状态转换如图2.5所示。

图2.5 中断前后的状态转换
若CONTROL[0] =1(线程模式+用户级),则在中断响应的始末,处理器模式和特权模式都要发生变化。中断前后的状态转换和特权模式切换如图2.6所示。

图2.6 中断前后的状态转换和特权模式切换
CONTROL[0]只有在特权模式下才能访问。用户模式的程序如想进入特权模式,通常都使用一条系统服务呼叫指令SVC来触发SVC异常,该异常的服务例程可以视具体情况来修改CONTROL[0]。