什么是栈?
在谈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。

了解Cortex-M3双堆栈MSP和PSP相关推荐

  1. Cortex-M3双堆栈MSP和PSP

    什么是栈? 在谈M3堆栈之前我们先回忆一下数据结构中的栈.栈是一种先进后出的数据结构(类似于枪支的弹夹,先放入的子弹最后打出,后放入的子弹先打出).M3内核的堆栈也不例外,也是先进后出的. 栈的作用? ...

  2. Cotex-M内核双堆栈指针MSP和PSP

    MSP和PSP 的含义是Main_Stack_Pointer 和Process_Stack_Pointer,在逻辑地址上他们都是R13: 权威手册上说的很清楚PSP主要是在Handler的模式下使用, ...

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

    FreeRTOS系列(1):基础知识--中断嵌套 FreeRTOS系列文章(2):PendSV功能,为什么需要PendSV FreeRTOS系列文章(3): 为什么将SysTick和PendSV的优先 ...

  4. Cortex M3寄存器组

    寄存器组 宗旨:技术的学习是有限的,分享的精神是无限的. 1.通用目的寄存器R0~R7 R0-R7 也被称为低组寄存器.所有指令都能访问它们.它们的字长全是 32 位,复位后的初始值是不可预料的. 2 ...

  5. ARM处理器的 Handler mode 与 Thread mode 以及 MSP 和 PSP

    注:本文仅用于本人学习. 1.Handler mode 与 Thread mode Cortex-M3处理器支持两种处理器的操作模式,还支持两级特权操作. 两种操作模式分别为:处理者模式(handle ...

  6. app和bootloader跳转 MSP与PSP

    app和bootloader跳转 MSP与PSP 1.不要把跳转函数放在中断中,如此导致在跳转后的app或者bootloder都是在中断状态,只要你一开启该中断,就可能出现硬件中断了 2.如果你的AP ...

  7. Cortex‐M3的Faults异常究竟是什么?

    关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | strongerHuang 有许多朋友在学习,或者开发STM32时都遇到过HardFault_Handler的情 ...

  8. Cotex-M MSP和PSP 指针

    MSP和PSP 的含义是Main_Stack_Pointer 和Process_Stack_Pointer,在逻辑地址上他们都是R13: 以下摘录自,cotex-M3权威指南 Cortex-M3内核有 ...

  9. Cortex M3 NVIC与中断控制

    Cortex M3 NVIC与中断控制 宗旨:技术的学习是有限的,分享的精神是无限的. 一.NVIC概览 --嵌套中断向量表控制器 NVIC 的寄存器以存储器映射的方式来访问,除了包含控制寄存器和中断 ...

最新文章

  1. 20135310陈巧然 20135305姚歌 实验一:开发环境的熟悉
  2. 阿里云对象存储OSS之通过URL形式进行图片处理
  3. php 开启mail函数 wo,php mail 函数发送邮件
  4. Maven阿里云与本地仓库配置
  5. 改服务器的ip地址如何修改密码,服务器ip地址修改密码
  6. InformaticaPowerCenter调用存储过程
  7. Flex3 CRUD 与Java后台交互 完整Demo
  8. java使用jacob语言实现阅读文字,文字转语音
  9. 2019小程序没必要做了_2019年,小程序还要不要做
  10. linux中定义用户账户的文件为,Linux中用户和组中认证库和解析库的文件格式以及默认参数定义文件...
  11. 计算机基础知识进制的转换,计算机基础之各进制间的相互转换
  12. Ubuntu下安装GParted并分区,进行虚拟机内存扩展
  13. 网易邮箱注册界面设计 html
  14. 100条超实用微信营销技巧:公众号、朋友圈和微信营销
  15. rm -rf和rm -f和rm
  16. 小驼峰法和大驼峰法的区别
  17. GNSS星历数据读取
  18. 如何理解工业互联网与智能制造,怎么共建智慧工厂?
  19. 电商前台项目(五):完成加入购物车功能和购物车页面
  20. Au 闪退解决方法(很邪门)

热门文章

  1. css中引入新的字体文件
  2. 巨盾补补终于发布了!!!
  3. pcie中文入门学习文档资料
  4. insert into 批量导入数据的案例
  5. 荐号 + 送礼 | 无线鼠标键盘套装
  6. rtsp协议开发指南
  7. Python 数据处理可视化(阶段三)
  8. 亚马逊封号解封,这个关键点你做好了吗?承认 请求 调整
  9. 小浩算法 第一期(0102月汇总)
  10. Discuz!7.2 SQL注入复现实验