Cortex-M3双堆栈MSP和PSP

Cortex-M3 的 双堆栈MSP和PSP 在裸机开发中,CONTROL的bit1始终是0,也就是说裸机开发中全程使用程MSP,并没有使用PSP。在执行后台程序(大循环程序)SP使用的是MSP,在执行前台程序(中断服务程序)SP使用的是MSP。栈是一种先进后出的数据结构(类似于枪支的弹夹,先放入的子弹最后打出,后放入的子弹先打出)。M3内核的堆栈也不例外,也是先进后出的。在OS开发中,当运行中断服务程序的时候CONTROL的bit1是0,SP使用的是MSP;当运行线程程序的时候CONTROL的bit1是1,SP使用的是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。
————————————————

原文链接:https://blog.youkuaiyun.com/zhaodong1102/article/details/105514284/

Arm ContxM FreeRTOS MSP之间PSP相互切换 FreeRTOS 创建线程的时候,事先往堆栈中保存EXC_TURN值,然后做线程切换的时候,先把保存的EXC_TURN值反映到CPU寄存器,这样执行线程的时候就变成了PSP.也就是说线程的时候使用PSP是人为设置的.相反MSP是硬件自己完成的,比如当发生中断后,执行中断函数的时候硬件吧SP改成MSP.代码从main()函数开始执行的时候,栈默认是MSP开始.当创建线程后从main函数切换到线程的时候,栈从MSP->PSP. 这个过程如下.4.执行线程的代码,除非线程结束,不然不会再继续main()函数。 阅读详情

相关推荐

Cotex-M MSP和PSP 指针

MSP和PSP 的含义是Main_Stack_Pointer 和Process_Stack_Pointer,在逻辑地址上他们都是R13; 以下摘录子,cotex-M3权威指南 Cortex-M3内核有两个堆栈指针:MSP-主堆栈指针和PSP-进程堆栈指针,在任何一个时刻只能有一个堆栈指针起作用,也就是说任何一个时刻只能使用一个堆栈指针,要么使用MSP,要么使用PSP。 何为堆栈指针,其实就是普通的指针,只是他们指向两个不同的堆栈。 MSP:主堆栈指针,当程序复位后(开始运行后),一直

zhuimeng_ruili的博客 9646

Cortex-M系列,MSP和PSP区别

比如,当应用程序发生栈溢出问题时,必须要确保应用程序的故障不会影响到操作系统的运行和异常事件的处理——也就需要保证始终要有栈空间来执行异常事件。例如,如果一个任务发生了堆栈溢出,我们需要确保这个问题不会影响到操作系统的运行和异常处理——也就是说,我们需要确保始终有足够的堆栈空间来处理异常。这就是MSP的作用,它为操作系统和异常处理程序提供了一个独立的堆栈。在Cortex-M系列中,引入MSP(主堆栈指针)和PSP(进程堆栈指针)的主要原因是为了实现操作系统的安全性和稳健性。

我的博客 4030

Cortex-M3的双堆栈魔法:如何用MSP/PSP实现裸机与OS的高效安全隔离

本文深入解析Cortex-M3双堆栈机制(MSP/PSP)在嵌入式安全开发中的应用,探讨如何通过硬件级隔离实现裸机与OS的高效安全隔离。结合STM32实例,详细介绍了双堆栈架构、CONTROL寄存器配置及与MPU的协同防御策略,为开发者提供实用的安全优化方案。

weixin_29207439的博客 420

STM32(Cortex-M) 双堆栈MSP/PSP科普

程序复位运行时,使用的一直是MSP,在任务开始运行时,osKernelStart->....->vPortStartFirstTask(portasm.s/freertos),将任务栈push到PSP,并切换到PSP。在发生异常或中断时,CPU自动进入Hanlder模式,CPU会自动设置CONTROL对应bit[1]为0,强制使用MSP。IAR中在Options-->Linker-->Config-->Edit中更改栈空间大小,也可以直接在icf文件中更改。MSP主堆栈指针,PSP进程堆栈指针。

且行且珍惜 6017

给RTOS新手的硬核科普:Cortex-M3/M4的双堆栈(MSP/PSP)到底在保护什么?

本文深入解析Cortex-M3/M4处理器的双堆栈机制(MSP/PSP),揭示其在RTOS稳定性中的关键作用。通过硬件级隔离设计,实现用户任务与内核/中断处理的堆栈分离,有效防止系统级崩溃,提升实时性和可靠性。文章结合代码示例和调试技巧,为RTOS开发者提供实用指南。

weixin_33722405的博客 300

Cortex M3的Thread和Handler工作模式,特权级与用户级,双堆栈指针MSP与PSP之间关系

在处理器中,和是两种核心操作模式,它们与和的关系密切,直接影响代码执行权限和内存访问控制。

创新改变世界! 1475

了解Cortex-M3双堆栈MSP和PSP

什么是栈? 在谈M3堆栈之前我们先回忆一下数据结构中的栈。栈是一种先进后出的数据结构(类似于枪支的弹夹,先放入的子弹最后打出,后放入的子弹先打出)。M3内核的堆栈也不例外,也是先进后出的。栈的作用? 局部变量内存的开销,函数的调用都离不开栈。 了解了栈的概念和基本作用后我们来看M3的双堆栈 cortex-M3内核使用了双堆栈,即MSP和PSP,这极大的方便了OS的设计。 MSP的含义是Main_Stack_Pointer,即主栈 PSP的含义是 Process_Stack_Pointer,即任务栈 SP:

billxin2012的专栏 2802

给RTOS新手:图解Cortex-M3/M4的双堆栈指针MSP和PSP到底怎么用

本文详细解析了Cortex-M3/M4处理器的双堆栈指针MSP和PSP的工作原理及在RTOS中的应用。通过生活场景类比和流程图解,帮助RTOS新手理解MSP(主堆栈指针)和PSP(进程堆栈指针)的隔离性、响应效率和上下文切换机制,并提供实战中的堆栈切换流程和常见问题排查技巧。

weixin_30938149的博客 370

Cortex-M3的双堆栈MSP和PSP(学习)

M3的栈,先进后出。是局部变量内存的开销,函数的调用都离不开栈。Cortex-M3内核使用了双堆栈,即MSP和PSP。MSP:Main_Stack_Pointer,即主栈。PSP:Process_Stack_Pointer,即任务栈。SP:SP是堆栈指针,指向最后一个被压入元素的地址。M3的压栈和弹栈过程。

Caramel_biscuit的博客 1809

深入Cortex-M3双堆栈与操作模式:如何为你的RTOS任务设计高效内存布局

本文深入探讨了Cortex-M3处理器的双堆栈指针(MSP/PSP)和特权分级机制,为RTOS任务设计高效内存布局提供实战指导。通过解析ARM内核架构的核心机制,揭示如何利用硬件特性优化任务切换和内存保护,避免常见配置陷阱,提升系统可靠性和性能。

weixin_33704591的博客 375

手把手教你用STM32CubeIDE调试Cortex-M3的NVIC与双堆栈指针

本文详细介绍了如何在STM32CubeIDE中调试Cortex-M3内核的NVIC(嵌套向量中断控制器)与双堆栈指针(MSP/PSP)。通过实战案例,帮助开发者掌握中断优先级配置、堆栈指针切换等关键技巧,提升嵌入式系统开发效率与稳定性。

weixin_30902251的博客 350

Cortex-M3 双堆栈指针(MSP&PSP)

【双堆栈指针(MSP&PSP)】 Cortex-M3内核中有两个堆栈指针(MSP & PSP),但任何时刻只能使用到其中一个。 复位后处于线程模式特权级,默认使用MSP。 通过SP访问到的是正在使用的那个指针,可以通过MSR/MRS指令访问指定的堆栈指针。 通过设置CONTROL寄存器的bit[1]选择使用哪个堆栈指针。CONTROL[1]=0选择主堆栈指针;CONTROL...

hanchaoman的专栏 4535

Transformer凭什么取代RNN?深入拆解自注意力机制与梯度消失问题的终极对决

本文深入探讨了Transformer如何通过自注意力机制解决RNN的梯度消失问题,成为自然语言处理领域的新标准。通过对比RNN和Transformer的架构差异,揭示了自注意力机制在并行计算、长期依赖处理等方面的技术优势,并提供了实际任务中的性能对比数据。

f6g7h8i9j的博客 190

Cortex-M3双堆栈MSP(主栈)和PSP(任务栈)

https://blog.youkuaiyun.com/zhaodong1102/article/details/105514284?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164096555116780269860332%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=164096555116780269860332&biz_id=0

dianqicyuyan的博客 734

STM32Cubemx-H7-17-麦克纳姆轮驱动

我们先看.h,知道哪些函数会有哪些功能和宏定义参数首先 是在.h的宏定义处定义引脚编号,比如tb6612控制方向的引脚,以及设定了哪个定时器作为pwm输出,还有编码计次的中断引脚/* 硬件相关宏定义 *//*1 前进方向往上 42 3*/// TB6612 方向引脚定义/* 定时器相关宏定义 *//* 编码器相关宏定义 */把自己的引脚根据原理图填对应,方向引脚也是,如果发现反转就把对应的引脚定义反过来,编码也是,编码我们用一个引脚就好,都在cubemx配置好。

m0_74211379的博客 1423

手把手教你用ZLMediaKit搭建WebRTC直播:本地推流与播放实战

本文详细介绍了如何使用ZLMediaKit搭建WebRTC直播系统,涵盖从环境准备、编译部署、SSL证书配置到本地推流与播放的完整实战流程。通过一步步的指导,帮助开发者快速掌握基于ZLMediaKit的WebRTC推拉流技术,构建低延迟的实时音视频应用。

weixin_28842367的博客 348

RTOS系列文章(6):Cortex-M3/4之SP,MSP,PSP,Thread模式、Handler模式、内核态、用户态

FreeRTOS系列(1):基础知识——中断嵌套 FreeRTOS系列文章(2):PendSV功能,为什么需要PendSV FreeRTOS系列文章(3): 为什么将SysTick和PendSV的优先级设置为最低 FreeRTOS系列文章(4): MDK软件仿真 + Debug-(printf)-Viewer使用方法 FreeRTOS系列文章(5):C语言程序运行原理分析:汇编、栈、栈帧、进栈、出栈、保存现场、恢复现场、返回在深入分析RTOS调度之前,我们还需要了解一下Cortex-M3/4的工作模式以及双

猪哥的专栏 1万+

SAR成像系列:【9】合成孔径雷达(SAR)成像算法-波数域(omega-K)成像算法[也叫距离徙动(RM)算法](附Matlab代码)

合成孔径雷达(SAR)波数域(wK)成像算法也称为距离徙动(RM)算法,它不存在近似条件,可以对整个成像区域基于散射点模型进行精确聚焦。有的文章中称它为SAR成像的最佳实现。

zr2006_7的专栏 1万+

Cortex-M3双堆栈机制与RTOS任务切换解析

嵌入式系统中,堆栈管理是RTOS任务调度的核心基础。Cortex-M3架构采用主堆栈指针(MSP)和进程堆栈指针(PSP)的双堆栈设计,通过CONTROL寄存器实现特权级隔离。这种机制在异常处理时自动切换堆栈指针,配合PendSV异常实现高效上下文切换。在RTOS环境下,MSP用于内核和中断处理,PSP专供用户任务使用,既保障系统安全又提升任务切换效率。通过SysTick中断触发、PendSV执行的实际案例,展示了双堆栈机制如何优化嵌入式实时系统的性能与可靠性。

weixin_42186015的博客 590

Qt入门教程【高级控件篇】QModelIndex索引

QModelIndex索引

小鱼酱的博客 4466

AIGC 算法工程师面试八股文全解析:Diffusion Models 原理、推导与实战要点

特性 | 重参数化技巧 (Reparameterization Trick) |本质| 将随机变量的采样过程从不可导的随机操作转换为可导的确定性函数与一个已知分布的随机噪声的组合。目的。

m0_71589036的博客 404

从裸机到FreeRTOS:我是如何理解Cortex-M3那双堆栈(MSP/PSP)的实战笔记

本文详细记录了从裸机开发转向FreeRTOS时,对Cortex-M3双堆栈机制(MSP/PSP)的实战探索。通过实验对比裸机与RTOS环境下的堆栈行为差异,深入分析硬件设计原理,并结合FreeRTOS源码解读任务调度中的堆栈切换实现,为嵌入式开发者提供实用的调试技巧和问题排查方法。

weixin_30591551的博客 245

金属表面粗糙度对信号的影响

之前的文章中,已经采用CST中的微带线模块进行了很多的仿真分析,本文将再次利用这些模块,从另外一个角度去探讨关于传输线的使用问题--金属的表面粗糙度。 众所周知,数据传输中,当速率越来越高时,信号在金属介质中的趋肤效应就愈发明显,能量就会更多地集中于金属的表面进行流动,此时,如果金属表面不再光滑而是凹凸不平,能量的传输过程就会产生波动,当这种波动积累到一定的量级,就会严重影响到传输线的阻抗稳定性,从而导致信号失真和传输异常。

一只豌豆象的博客 2895

FreeRTOS任务切换的幕后功臣:手把手拆解Cortex-M3的PendSV与双堆栈机制

本文深入解析FreeRTOS在Cortex-M3架构下的任务切换机制,重点探讨PendSV异常与双堆栈(MSP/PSP)设计的协同工作原理。通过硬件层面的详细拆解和实战代码示例,揭示FreeRTOS实现高效多任务调度的核心技术,帮助嵌入式开发者优化实时系统性能并解决常见问题。

weixin_30254435的博客 360

ROS与深度相机入门教程:(1)Ubuntu16.04 在ROS中驱动Intel D435i深度相机

Intel在Github上开源了支持所有RealSense系列相机的SDK,包括了D400、SR300系列深度相机和T265双目跟踪相机,支持Linux、Windows、Mac OS以及Android,链接:https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.md#installin...

m0_37957160的博客 2075

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: C语言二级指针(指向指针的指针)详解
下一篇: NUC972-5寸电容屏-linux-drv-chrdevbase
oshan2012
博客等级 码龄15年 300粉丝 91原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值