我一直在阅读ARM信息中心的各个部分,试图找到我的答案,但是我到了一个让我感到困惑的地步,所以我希望这里有人能帮上忙。
据我所知,Cortex-M处理器中有两个堆栈:
我想弄清楚每一个都是如何被手臂核心所使用的。
ARM信息中心在讨论Cortex-M3时的文档说明如下:
主堆栈在重置时使用,并且总是以Handler模式使用(当输入异常处理程序时)。进程堆栈指针只能在线程模式下作为当前堆栈指针使用。
好的,这告诉我MSP是用来重置的。然而,这些文件还说明如下:
线程模式
用于执行应用软件。处理器在脱离重置时进入线程模式。
处理程序模式
用于处理异常。处理器在完成所有异常处理后返回线程模式。
好吧,这就是让我困惑的地方。如果MSP在重置时使用,并且总是在Handler模式中使用,而PSP在线程模式中使用,那么如果处理器处于重置状态,那么如何在重置时使用MSP?
发布于 2018-08-25 08:08:11
简单的回答:你的最后一段不正确。默认情况下,线程模式使用MSP .
你没有说你使用的是哪个处理器,所以让我们假设一个Cortex-M3。查看CONTROL
寄存器在此页底部的描述:SPSEL
位控件正在使用哪个堆栈,对于线程和Handler模式,默认为MSP,并且只能在线程模式下写。
此外,虽然这不是您的问题的一部分,线程模式也是默认的特权。在同一个寄存器中设置nPRIV
位会使线程模式没有特权。
总之:处理程序模式总是有特权的,并且总是使用MSP。默认情况下,线程模式也是如此,但是CONTROL
寄存器允许对此进行更改。
更多的上下文.
例如,如果您正在编写一个小型操作系统,则通常希望线程模式代码是非特权的。如果线程模式代码使用PSP,任务切换也会容易得多,因为您的任务切换代码将不可避免地以Handler模式运行(通常在Cortex-M上的PendSV处理程序中),它可以使用自己的堆栈而不影响它试图切换的任务的堆栈。
为此,操作系统的初始化代码通常必须(按此顺序):
MSR
指令使PSP指向该区域的顶部(这需要特权,但也必须从线程模式执行,因为SPSEL
忽略了在Handler模式中的写入)MSR
指令在CONTROL
寄存器中设置SPSEL
位,将正在运行的代码切换到使用PSP和新准备的堆栈空间。ISB
指令,以确保以下所有指令按需要使用PSPMSR
设置CONTROL
寄存器中的nPRIV
位,立即从线程模式中删除特权然后,正在运行的线程模式代码成为空闲任务。
https://stackoverflow.com/questions/52013343
复制相似问题