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

M3的栈,先进后出。

是局部变量内存的开销,函数的调用都离不开栈。

Cortex-M3内核使用了双堆栈,即MSP和PSP。

MSP:Main_Stack_Pointer,即主栈。

PSP:Process_Stack_Pointer,即任务栈。

SP:SP是堆栈指针,指向最后一个被压入元素的地址。

M3的压栈和弹栈过程。

  • 压栈:SP先自减4,然后将待压入的数据存放到SP所指的地址。
  • 弹栈:从SP指针所指的地址读出数据,然后SP指针自增4。

M3内核堆栈生长方向是向下生长,且是32位的。

M3内核何时使用MSP何时使用PSP?

M3双堆栈的意思是两个堆栈,但任何时候只能使用其中一个。

SP寄存器中的值在某一时刻到底是MSP还是PSP?

这是根据CONTROL寄存器的bit1来决定的,当CONTROL的bit1为0使用MSP(默认方式),为1时使用PSP。

控制寄存器有两个用途,其一用于定义特权级别,其二用于选择当前使用哪个堆栈指针。

设立双指针是为了保护OS的安全性和稳健性。
操作系统和异常事件用MSP。
用户程序(线程)用PSP。
MSP和PSP指针之间的切换会在处理异常事件时自动完成。

区别于用户程序使用PSP,操作系统和异常事件单独使用一个MSP指针的目的,为了保证栈数据不会被用户程序意外访问或栈空间被用户程序占用。

比如,当应用程序发生栈溢出问题时,必须要确保应用程序的故障不会影响到操作系统的运行和异常事件的处理------也就是需要保证始终有栈空间来执行异常事件。

裸机的时候,使用MSP指针。其实OS在上电复位到切换线程之前用的都是MSP指针,也就是线程切换之前都是一个裸机程序的状态。

相关推荐
Wallace Zhang2 小时前
SimpleFOC源码学习10(v2.3.2) - 电流传感器CurrentSense.cpp与CurrentSense.h
驱动开发·stm32·学习·电流环·simplefoc·foc电机控制
小仙女的小稀罕4 小时前
适合销售从业者会议整理使用的销售录音转任务工具
大数据·人工智能·学习·自然语言处理·语音识别
普通网友5 小时前
HTML5新增了哪些重要标签?多多学习也是成长的一部分
前端·学习·html5
南境十里·墨染春水5 小时前
linux学习进展 mysql数据库
linux·数据库·学习
深蓝海拓5 小时前
用HSL颜色系统改造qdarkstyle样式表库
前端·笔记·python·qt·学习
嵌入式小企鹅5 小时前
大模型算法工程师面试宝典
人工智能·学习·算法·面试·职场和发展·大模型·面经
-To be number.wan5 小时前
操作系统 | 关于时间片大小的确定问题
学习·操作系统
阿荻在肝了6 小时前
Agent学习八:LangGraph学习-小结
python·学习·agent
冻感糕人~6 小时前
大模型面试干货:小白程序员如何准备,轻松拿下高薪Offer?收藏这份独家秘籍!
java·人工智能·学习·ai·面试·职场和发展·大模型学习
陌路206 小时前
第一行代码--初步学习--Android四大组件-activity1
android·学习