Cortex-M3 处理器支持:
-
两种操作模式,即线程模式和处理程序模式
-
两种执行模式,即特权模式和用户模式。
重置时会进入线程模式,并且通常从异常中返回时也会进入该模式。 在线程模式下,代码可以在特权模式或用户模式下执行。
发生异常后将进入处理程序模式。 所有代码都在特权模式下执行。 发生异常时,内核会自动切换到特权模式。
特权模式具有完全访问权限。
用户模式具有有限的访问权限。 这些限制包括:
-
指令用法的限制,如
MSR
指令中可以使用哪些字段 -
某些协处理器寄存器用法的限制
-
基于系统设计对内存和外围设备访问的限制
-
MPU 配置施加的对内存和外围设备访问的限制。
从异常中返回时,通过修改链接寄存器 (R14) 中 EXC_RETURN 值可以从特权线程模式更改为用户线程模式。 通过使用 MSR
指令清除 CONTROL[0],也可以从特权线程模式更改为用户线程模式。 不过,不通过异常处理(例如 SVC
)无法直接从非特权模式更改为特权模式
Cortex-M3 处理器支持两个不同堆栈,主堆栈和进程堆栈。 它有两个堆栈指针 (SP),分别用于两个堆栈。 一次只能看见一个堆栈指针,具体取决于正在使用的堆栈。
重置以及进入异常处理程序时使用主堆栈。 要使用进程堆栈,必须选择该堆栈。 可以通过以下方法之一执行此操作:
-
退出处理程序模式时,可通过使用 EXC_RETURN 值
-
在线程模式中时,可通过使用
MSR
指令写入 CONTROL[1]。
Note
您的初始化代码或上下文切换代码必须对进程堆栈指针进行初始化。
Cortex-M3 中使用 NVIC 表示 Cortex-M3 的向量表与以前的 ARM 内核有很大不同。 Cortex-M3 向量表包含异常处理程序和 ISR 的地址,而多数其他 ARM 内核包含指令。 初始堆栈指针以及重置处理程序的地址必须分别位于 0x0
和 0x4
。 重置时,这些地址会加载到适当的 CPU 寄存器中。
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0203hc/Cihdidh2.html