主堆栈指针MSP和堆栈指针SP的区别和联系
在ARM Cortex-M处理器中SPStack Pointer堆栈指针是一个统称而MSPMain Stack Pointer主堆栈指针是SP的两种具体实现之一。 核心区别SP的两种身份SP (堆栈指针)RTOS中使用这是寄存器R13的别名**。它像一个“通道”在任一时刻只能指向并操作一个具体的物理堆栈指针寄存器。MSP (主堆栈指针裸机使用) 与 PSP (进程堆栈指针)这是SP这个“通道”背后两个物理上独立的寄存器。SP当前具体操作哪一个取决于处理器的工作模式。 联系它们如何协同工作两者的联系体现在SP作为一个“通道”根据处理器模式动态切换指向MSP或PSP复位与异常处理Handler模式系统复位后或处理任何中断/异常时强制使用MSP。这是最高优先级、最可靠的操作环境。普通程序运行Thread模式在此模式下可以通过CONTROL寄存器的SPSEL位来选择使用哪个指针。选择MSPCONTROL[1]0。这是复位后的默认状态常用于简单的裸机程序。选择PSPCONTROL[1]1。通常在有RTOS实时操作系统时使用。 位置两个栈在内存中的哪里MSP和PSP的位置不由硬件固定而是由软件链接脚本定义它们都位于系统的RAM随机存取存储器中。MSP的位置其初始值在系统复位时由向量表Vector Table的第一个字4字节自动加载。这个值在链接时确定通常指向RAM的末尾区域。PSP的位置没有硬件自动初始化其初始值必须由用户软件如RTOS内核相当于裸机开发中的.bss段在初始化时设置。在RTOS中每个任务通常都有自己的PSP。 为什么要设计两个堆栈指针这是为了系统的安全与稳定。其核心目的是将高特权级的系统内核和异常处理使用MSP与普通的用户任务使用PSP的堆栈在物理上隔离开来。这样做可以确保即使某个用户任务的堆栈出现问题如溢出也不会破坏操作系统内核或中断处理程序运行所必需的堆栈空间。在裸机开发时会用到PSP吗极大概率用不到。在常规的裸机开发指不加RTOS直接跑while循环中全程只使用MSP主堆栈PSP进程堆栈基本处于“休眠”状态。具体原因和例外情况如下1. 为什么裸机默认不用 PSP复位默认就是 MSP芯片复位后硬件自动从向量表加载 MSP 的初始值并将CONTROL寄存器的SPSEL位清零默认就指向 MSP。全程运行在 Thread 模式裸机程序的主函数main和所有中断/异常服务函数都运行在“线程模式特权级”下。既然只有这一个“线程”在跑使用唯一的 MSP 最直接、效率最高。切换 PSP 徒增开销如果非要切到 PSP你需要手动给 PSP 寄存器赋值并修改CONTROL寄存器。这反而增加了代码复杂度且没有任何收益。2. 什么“裸机”情况下会用到 PSP虽然少但以下两种特殊裸机场景会用到你正在裸机上“手搓”任务调度器如果你不想用现成的 RTOS如 FreeRTOS而是在裸机中断里手动切换任务为了隔离不同任务的栈空间你可以主动开启 PSP让每个任务的私有栈使用 PSP而中断上下文依然使用 MSP。不过很多开发者即使手搓调度器为了省事也依然让所有任务共用 MSP通过将栈指针指向不同的数组地址。进行安全校验或内核探索为了测试 Cortex-M 的双堆栈机制或者写底层 Bootloader 时验证栈溢出保护。3. 一个容易混淆的“例外”重点很多人会误以为“中断里用 MSP主循环里用 PSP”是硬件默认的这是错的硬件默认行为复位后无论是主循环还是中断一律使用 MSP。切换时机只有当你主动编写代码将CONTROL[1]置 1 后主循环Thread模式才会切到 PSP而中断Handler模式不受影响永远强制使用 MSP。 给你的裸机开发建议如果你刚入门完全忽略 PSP 的存在只把 MSP 管好就行。只需关注启动文件中的Stack_Size定义确保 MSP 的栈空间通常位于 RAM 末尾足够大防止溢出。不要试图在裸机中随意修改 SP 寄存器指向 PSP这很容易导致内核硬故障HardFault因为此时 PSP 寄存器还是“野值”未初始化。总结一句话裸机开发默认只用 MSP如果你没写操作系统任务切换代码PSP 就不会被启用。专注于 MSP 的栈大小规划是裸机开发中最稳健的做法。

相关新闻

深入解析复杂UART外设:从寄存器配置到多模式切换与高级功能实战

深入解析复杂UART外设:从寄存器配置到多模式切换与高级功能实战

1. 项目概述:从寄存器表到可运行的串口驱动如果你在嵌入式开发中调过串口,大概率遇到过这样的场景:芯片手册给出一张几十页的寄存器列表,每个寄存器都有十几个位字段,旁边还附带着UART、IrDA、CIR等多种模式的切换说明…

2026/10/12 5:45:04 阅读更多 →
C++高性能金融系统实战:信用卡额度管理平台架构与核心实现

C++高性能金融系统实战:信用卡额度管理平台架构与核心实现

1. 项目概述与核心价值最近在整理过往的项目经验,发现一个挺有意思的案例:一个用C实现的信用卡额度管理平台。这玩意儿听起来像是银行内部系统,但实际上,它是我几年前为一个中型消费金融公司做的核心风控模块原型。当时的需求很明…

2026/10/2 12:17:12 阅读更多 →
wmutils/core源码解析:从util.c看工具共享功能实现

wmutils/core源码解析:从util.c看工具共享功能实现

wmutils/core源码解析:从util.c看工具共享功能实现 【免费下载链接】core Set of window manipulation tools 项目地址: https://gitcode.com/gh_mirrors/core106/core 如果你正在寻找一个简单高效的X窗口管理工具集,wmutils/core绝对是值得深入了…

2026/10/14 2:49:34 阅读更多 →

最新新闻

superpowers安装配置全攻略:从零跑通到避坑指南

superpowers安装配置全攻略:从零跑通到避坑指南

1. 从“superpowers”这个标题说起:它到底是什么 第一次看到“superpowers”这个词,很多人脑子里蹦出来的可能是超级英雄电影里的超能力,或者是某个游戏里的技能系统。但如果你是在技术社区、开源项目或者工具链的语境下看到它,那…

2026/10/15 10:31:27 阅读更多 →
print调试法:从入门到精通,秒杀偶发与并发疑难杂症

print调试法:从入门到精通,秒杀偶发与并发疑难杂症

凌晨一点半,测试环境的告警响了第三回。我在终端里翻着日志,边上蹲着的实习生小声问:"哥,这事都复现三次了,你挂个断点看一眼不就行了?"我一边敲print一边回他:"断点要是能抓到那…

2026/10/15 10:31:27 阅读更多 →
高效能人士的七个习惯PPT模板:从结构到演讲的实战指南

高效能人士的七个习惯PPT模板:从结构到演讲的实战指南

简介:《高效能人士的七个习惯》PPT演讲模板,适合职场培训、团队晨会、个人成长分享等场景,也方便讲师围绕积极主动、以终为始、要事第一、双赢思维做结构化讲解。模板重点呈现四象限法则与目标管理方法,将任务分为重要且紧急、重要…

2026/10/15 10:31:27 阅读更多 →
Java大数据导出优化:流式查询解决OOM问题

Java大数据导出优化:流式查询解决OOM问题

1. 项目背景与核心痛点去年处理一个千万级数据导出需求时,我的Java应用在导出到50万行左右突然崩溃,监控显示堆内存直接爆了。这种大数据量导出场景下的OOM(内存溢出)问题,是后端开发者的经典噩梦。传统分页查询在数据…

2026/10/15 10:31:27 阅读更多 →
Python自动化运维:exe自动升级机制设计与实现

Python自动化运维:exe自动升级机制设计与实现

1. 自动升级这件事,为什么值得单独拿出来做做Python自动化运维的人,迟早会碰到一个绕不开的场景:你写了一个打包成exe的小工具,分发给了十几台甚至几十台机器上的同事或客户使用。第一版跑得好好的,第二版修了个bug、加…

2026/10/15 10:31:27 阅读更多 →
网络空间安全夏令营线上复试全攻略:从准备到复盘

网络空间安全夏令营线上复试全攻略:从准备到复盘

1. 一场线上复试的亲历复盘与拆解2020年7月16日,我参加了一场网络空间安全方向的夏令营复试,形式是线上。那一年情况特殊,绝大多数院校的夏令营都转到了线上,考核方式、面试节奏、甚至设备调试的细节,都和往年线下完全…

2026/10/15 10:30:26 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →