首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在ARM Cortex-M,MSP还是PSP中,哪一个堆栈是从重置中出来的?

在ARM Cortex-M,MSP还是PSP中,哪一个堆栈是从重置中出来的?
EN

Stack Overflow用户
提问于 2018-08-25 01:31:57
回答 1查看 3.1K关注 0票数 4

我一直在阅读ARM信息中心的各个部分,试图找到我的答案,但是我到了一个让我感到困惑的地步,所以我希望这里有人能帮上忙。

据我所知,Cortex-M处理器中有两个堆栈:

  • 主堆栈指针
  • 进程堆栈指针

我想弄清楚每一个都是如何被手臂核心所使用的。

ARM信息中心在讨论Cortex-M3时的文档说明如下:

主堆栈在重置时使用,并且总是以Handler模式使用(当输入异常处理程序时)。进程堆栈指针只能在线程模式下作为当前堆栈指针使用。

好的,这告诉我MSP是用来重置的。然而,这些文件还说明如下:

线程模式

用于执行应用软件。处理器在脱离重置时进入线程模式。

处理程序模式

用于处理异常。处理器在完成所有异常处理后返回线程模式。

好吧,这就是让我困惑的地方。如果MSP在重置时使用,并且总是在Handler模式中使用,而PSP在线程模式中使用,那么如果处理器处于重置状态,那么如何在重置时使用MSP?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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指令,以确保以下所有指令按需要使用PSP
  • 再次使用MSR设置CONTROL寄存器中的nPRIV位,立即从线程模式中删除特权

然后,正在运行的线程模式代码成为空闲任务。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52013343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档