裸机和RTOS的MSP、PSP堆栈指针切换机制

0 前言

Cortex‐M3/M4/M7内核拥有MSP(主堆栈指针)、PSP(进程堆栈指针)2个堆栈指针,在裸机和RTOS下这2个堆栈是如何切换保证系统稳定运行的呢?本文将从裸机和RTOS这2个方面展开介绍。

1 裸机和RTOS的堆栈切换机制

1.1 裸机下的堆栈切换机制

裸机下我们只会使用MSP,这也是MCU复位后默认的使用方式。即设置CONTROL[1]=0,只使用MSP。此时无论是否在执行异常服务函数,都只使用MSP。下面是一个异常来临时裸机的堆栈指针使用情况示意图:
在这里插入图片描述
有关CONTROL[1]寄存器的介绍如下:
在这里插入图片描述

1.2 RTOS下的堆栈切换机制

在RTOS中,除了异常服务中使用MSP,其余情况均使用PSP。这样做的好处可以避免因为PSP的操作错误导致MSP出现异常导致全盘崩溃,提高健壮性。
为了在线程模式下使用PSP,就必须将CONTROL[1]设置为1。这样线程模式下将会使用PSP,Handler模式继续使用MSP(Handler模式永远使用MSP)。下面是一个异常来临时RTOS的堆栈指针使用情况示意图:
在这里插入图片描述
注:当异常发生时,CPU会使用PSP自动压栈(压入异常发生时xPSR, PC, LR, R12,R3-R0寄存器值到线程栈)保护现场,进入异常Handler后才自动改为MSP,退出异常时再恢复为PSP,同时从线程栈上弹出数据恢复现场(弹出异常发生时保存在线程栈的xPSR, PC, LR, R12,R3-R0寄存器值到CPU对应寄存器)。
有关CONTROL[1]寄存器的介绍如下:
在这里插入图片描述

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NW嵌入式开发

感谢您的支持,让我们一起进步!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值