Cortex-M3 操作模式与特权等级

Cortex-M3支持2个模式(Handler模式、线程模式)和2个特权等级(特权级、非特权级)。

  • 当处理器处在线程模式时,既可以使用特权级,也可以使用非特权级。
  • 当处理器处在Handler模式时,总是特权级的。
  • 在复位后,处理器进入“线程模式+特权级”。
  • 在“线程模式+非特权级(用户级)”下,禁止对系统控制空间(SCS)的访问。
  • 在“线程模式+非特权级(用户级)”下,禁止使用MRS/MSR访问除了APSR之外的特殊功能寄存器。

【操作模式与特权等级状态转换图】

【线程模式特权级 与 Handler模式特权级 相互切换】

 当CONTROL[0]=0时,线程模式特权级,在异常处理的始末,只发生了处理器模式的切换,如:

【线程模式非特权级 与 Handler模式特权级 相互切换】

当CONTROL[0]=1时,线程模式非特权级(用户级),则在异常处理的始末,处理器模式和特权等级都发生变化,如:

【线程模式非特权级 与 线程模式特权级&Handler模式特权级 切换】

  • 芯片复位后,进入线程模式特权级
  • 线程模式特权级与Handler模式特权级之间通过异常/中断的进出来切换。
  • 在特权级下的代码可以通过置位CONTROL[0]来进入非特权级。
  • Handler模式永远都是特权级的。不管是任何原因产生了任何异常,处理器都将以特权级来运行其服务例程,异常返回后,系统将回到产生异常时所处的级别。
  • Handler模式通过异常/中断进入,退出即返回线程模式。从Handler模式异常返回时,也可以通过置位CONTROL[0](非特权级的线程模式)或清零CONTROL[0](特权级的线程模式)来改变返回线程模式的级别。
  • 线程模式非特权级下的代码不能再试图修改CONTROL[0]来回到线程模式特权级。它必须通过一个异常进入到Handler模式,由那个异常Handler处理来修改,清零CONTROL[0]为线程模式特权级,才能在返回到线程模式后拿到特权级。

参考摘录:

《Cortex-M内核系列和STM32-讲座2教程.pdf》

《ARM Cortex-M3权威指南.pdf》

原文地址:https://www.cnblogs.com/utank/p/11249228.html