Cortex-M3双堆栈MSP和PSP+函数栈帧
为了防止几百年以后找不到该文章,特此转载
------------------------------------------------开始转载---------------------------------------------------------------------------------------------------
什么是栈?
在谈M3堆栈之前我们先回忆一下数据结构中的栈。栈是一种先进后出的数据结构(类似于枪支的弹夹,先放入的子弹最后打出,后放入的子弹先打出)。M3内核的堆栈也不例外,也是先进后出的。
栈的作用?
局部变量内存的开销,函数的调用都离不开栈。
了解了栈的概念和基本作用后我们来看M3的双堆栈
cortex-M3内核使用了双堆栈,即MSP和PSP,这极大的方便了OS的设计。
MSP的含义是Main_Stack_Pointer,即主栈
PSP的含义是 Process_Stack_Pointer,即任务栈
SP:SP是堆栈指针,指向最后一个被压入元素的地址。
M3的压栈和弹栈过程:
压栈:SP先自减4,然后将待压入的数据存放到SP所指的地址
弹栈:从SP指针所指的地址读出数据,然后SP指针自增4。
为什么压栈SP自减,弹栈SP自增呢?这是因为M3内核堆栈生长方向是向下的。为什么压栈和弹栈分别是减4加4呢?这是因为M3是32bit的内核。
M3内核何时使用MSP何时使用PSP?
M3双堆栈的意思是有两个堆栈,但是任何时刻只能使用其中之一。那什么时候使用MSP,什么时候使用PSP呢?也就是说SP寄存器中的值在某一时刻到底是使用MSP的值还是PSP的值?这是根据CONTROL寄存器的bit1来决定的。当CONTROL的bit1为0使用MSP(默认方式);当CONTROL的bit1为1使用PSP。

总结:CONTROL的bit1为0,SP = MSP
CONTROL的bit1为1,SP = PSP
M3复位后处于线程模式特权级,默认使用MSP。
通过配置CONTROL寄存器的bit1位就可以决定SP使用MSP还是PSP。
在裸机开发中,CONTROL的bit1始终是0,也就是说裸机开发中全程使用程MSP,并没有使用PSP。在执行后台程序(大循环程序)SP使用的是MSP,在执行前台程序(中断服务程序)SP使用的是MSP。
在OS开发中,当运行中断服务程序的时候CONTROL的bit1是0,SP使用的是MSP;当运行线程程序的时候CONTROL的bit1是1,SP使用的是PSP。
————————————————
版权声明:本文为CSDN博主「zhaodong1102」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhaodong1102/article/details/105514284/
-----------------------------------------------结束转载---------------------------------------------------------------------------------------------------
看下图,提出我的问题==》 汇编启动文件内定义了栈大小,对应这个栈,会在哪些场景下被使用呢?

根据上面转载的博客,我的理解是:
裸机工程,全程使用MSP,这里对应的栈肯定就是MSP(因为没跑RTOS,其他地方不会再自定义栈了)。发生中断、 函数调用等,都是用的这个栈。
RTOS上,当运行中断服务程序的时候,使用的是MSP,应该对应的就是这个栈;而当运行线程程序的时候,使用的是PSP,PSP会指向自己定义的任务栈,所以在任务内进行函数调用,会入栈至自定义的任务栈。
刚进入main函数后,不同的RTOS,应该还是有些区别:
1.RT-Thread内会重定义main,用户使用的main入口是main线程,所以在这个main入口函数内调用函数时,栈指针SP指向的是PSP,即会入栈至main的任务栈内。
2.FreeRTOS内未重定义main,用户使用的main入口就是原生从汇编刚跳转出来的main入口,若在这个main入口函数内调用函数,
且多任务相关代码还未跑起来时,CONTROL的bit1应该如上图所示,是复位后的缺省值,即会使用MSP,即该汇编启动文件内的栈。
一句话,启动文件内的设置的栈对应的就是MSP指向的栈, MSP、PSP分别会在哪些场景下被使用呢,如上所述。
部分验证思路:
对于进入任务栈的情况,可以打印下任务栈数组,结合函数栈帧的知识一起分析,加深理解。
Cortex-M3双堆栈MSP和PSP+函数栈帧的更多相关文章
- c函数调用过程原理及函数栈帧分析
转载自地址:http://blog.csdn.net/zsy2020314/article/details/9429707 今天突然想分析一下函数在相互调用过程中栈帧的变化,还是想尽量以比 ...
- C函数调用过程原理及函数栈帧分析(转)
在x86的计算机系统中,内存空间中的栈主要用于保存函数的参数,返回值,返回地址,本地变量等.一切的函数调用都要将不同的数据.地址压入或者弹出栈.因此,为了更好地理解函数的调用,我们需要先来看看栈是怎么 ...
- 自己动手实现arm函数栈帧回溯【转】
转自:http://blog.csdn.net/dragon101788/article/details/18668505 内核版本:2.6.14 glibc版本:2.3.6 CPU平台:arm gl ...
- 【freertos】002-posix模拟器设计与cortex m3异常处理
目录 前言 posix 标准接口层设计 模拟器的系统心跳 模拟器的task底层实质 模拟器的任务切换原理 cortex M3/M4异常处理 双堆栈指针 双操作模式 栈帧 EXC_RETURN 前言 如 ...
- 谈谈arm下的函数栈
引言 这篇文章简要说说函数是怎么传入参数的,我们都知道,当一个函数调用使用少量参数(ARM上是少于等于4个)时,参数是通过寄存器进行传值(ARM上是通过r0,r1,r2,r3),而当参数多于4个时,会 ...
- [Android Pro] 深入理解函数的调用过程——栈帧
cp :http://blog.csdn.net/x_perseverance/article/details/78897637 每一个函数被调用时,都会为函数开辟一块空间,这块空间就称为栈帧. 首先 ...
- Cortex-M3 双堆栈指针(MSP&PSP)
[双堆栈指针(MSP&PSP)] Cortex-M3内核中有两个堆栈指针(MSP & PSP),但任何时刻只能使用到其中一个. 复位后处于线程模式特权级,默认使用MSP. 通过SP访问 ...
- stm32和cortex M3学习内核简单总结
1.stm32综述 2.寄存器组 3.操作模式和特权级别 4.存储器映射 5.中断和异常 6.其他 Stm32综述 这可以说是我第一款认真学习的单片机了,学完这个就要开启我通往arm9的大门了,接下来 ...
- 从Cortex-M3的MSP 和PSP谈Linux能否在中断中使用Sleep
1.Cortex-M3 的PSP和MSP 曾经在STM32上使用过RT thread和uC/OS,对于任务切换代码一直是一知半解,没有自己手动写出来过,对于任务切换后的ORR LR, LR, #0 ...
随机推荐
- k8s设置pod运行完自动删除
本环境apiserver.controller还要scheduler都是以pod的形式运行的,修改/etc/kubernetes/manifests下面对应的三个.yaml静态文件,加入 - --fe ...
- 07.初步学习redis哨兵机制
[ ] 一.哨兵(sentinal)的介绍 哨兵是redis集群架构中非常重要的一个组件,主要功能如下: 集群监控,负责监控redis master和slave进程是否正常工作 消息通知,如果某个re ...
- 学习一下 JVM (三) -- 了解一下 垃圾回收
一.简单了解几个概念 1.什么是垃圾(Garbage)?什么是垃圾回收(Garbage Collection,简称 GC)? (1)什么是垃圾(Garbage)? 这里的垃圾 指的是 在程序运行过程中 ...
- laravel封装方法在blade视图中使用
我这里使用的是Laravel7版本(本人只用过7 这里应该和5差别不大吧....) 首先需要在app/Providers/AppServiceProviders.php下的boot方法进行设置 示例: ...
- Macbook Pro HDMI 无信号解决办法
因为CS:GO无法启动的问题,使用过了下面的命令 sudo pmset -a GPUSwitch 0 导致HDMI显示器无信号 输入下面的代码 sudo pmset -a GPUSwitch 1 可以 ...
- 6 年前,只会 JSP 和 Servlet 就可以找到工作
这篇文章在去年就已经构思了,不过一直都没有整理出来,今天终于完成了这篇文章,所以发上来给大家看一看,都是一些个人的小感慨,我的观点可能不是非常的完善,大家也可以一起讨论. 找工作之难,难于上青天 五六 ...
- PIoU Loss:倾斜目标检测专用损失函数,公开超难倾斜目标数据集Retail50K | ECCV 2020 Spotlight
论文提出从IoU指标延伸来的PIoU损失函数,能够有效地提高倾斜目标检测场景下的旋转角度预测和IoU效果,对anchor-based方法和anchor-free方法均适用.另外论文提供了Retail5 ...
- 下载EXCEL格式设置
1)文本:vnd.ms-excel.numberformat:@2)日期:vnd.ms-excel.numberformat:yyyy/mm/dd3)数字:vnd.ms-excel.numberfor ...
- Node.js向MongoDB中插入并查询数据
首先必须要保持Node.js与MongoDB保持连接 具体教程见:Node.js连接MongoDB数据库步骤 插入数据步骤如下 node项目文件如下:在routes文件夹下新建insert.js文件, ...
- 说说XcodeLLDB调试的那些事儿
使用场景之一,接收他人的项目,快速理清其层次结构,可以打标识符断点,如下图 每一个VC,都加了个在viewDidLoad方法处的断点,这样运行程序时,逐步断点,便可以理清层次, 但是,需要手动不断的继 ...