2017-08-02 49 views
1

Cortex M3处理器有两个堆栈指针:PSP,MSP。 在一些复杂的应用程序中,用户程序使用PSP指向用户程序堆栈。异常处理程序使用指向主堆栈的MSP。从Cortex M3处理器的用户程序进入中断处理程序时使用哪个堆栈?

问题是: 用户程序运行时发生中断。在进入中断处理程序之前,R0-R3,R12,LR,PC和xPSR寄存器将被压入堆栈。但是,哪个堆栈用于存储这些寄存器?

+0

有时他们有两个堆栈指针,不能确定在m3上,但有些cortex-ms是编译时选项。而使用第二个堆栈指针是最痛苦的,除非你正在专门尝试使用它,否则你将共享一个堆栈。微不足道的看你是否在处理程序中复制/转储堆栈然后检查它... –

+0

Os使用主堆栈,用户程序使用程序堆栈。一些简单的应用程序将只使用MSP(主栈)。 –

+0

堆栈指针SP指向SP_main和SP_process。当前堆栈取决于模式,在线程模式下,CONTROL.SPSEL位的值为 ,请参阅第B1-575页的专用CONTROL寄存器。重置 选择并初始化SP_main,请参阅第B1-586页上的重置行为。 –

回答

4

根据我对ARM文档(Cortex-M3设备通用用户指南)的了解,异常输入时的寄存器堆栈发生在当前的堆栈上,然后处理器进入处理器模式。如果你仔细想想,这对于普通情况来说是最方便的行为。

+0

因此,当处理器从用户程序进入异常处理程序时,它将编程堆栈。在异常处理程序结束时,它将弹出程序堆栈并返回到线程模式。 –

+0

同样,如果您阅读文档,处理器会将EXC_RETURN值存储到链接寄存器(LR),并使用该值来了解异常处理何时结束以及处理器模式继续执行。所以在从线程模式中取出一个异常的情况下,在正常情况下,异常返回将使您回到线程模式,并使用线程模式堆栈指针来恢复寄存器。请注意,操作系统任务隐含的操作系统和上下文切换可以更改此顺序以满足他们的需求。 –

相关问题