关于 Cortex-M3 的双堆栈机制

通俗解释ARM Cortex-M堆栈机制:双堆栈指针工作原理 详解ARM Cortex-M架构中的堆栈工作原理,重点解析主堆栈与进程堆栈的切换机制及其在中断处理中的应用,帮助开发者更好掌握arm内核的运行细节。 阅读详情

 寄存器简介

Cortex-M 系列 CPU 的寄存器组里有 R0~R15 共 16 个通用寄存器组和若干特殊功能寄存器,如下图所示。下图中我看可以看到MSP和PSP两个堆栈指针寄存器。

通用寄存器组里的 R13 作为堆栈指针寄存器 (Stack Pointer,SP);R14 作为连接寄存器 (Link Register,LR),用于在调用子程序时,存储返回地址;R15 作为程序计数器 (Program Counter,PC),其中堆栈指针寄存器可以是主堆栈指针(MSP),也可以是进程堆栈指针(PSP)

Cortex-M 的堆栈寄存器 SP 对应两个物理寄存器 MSP 和 PSP,MSP 为主堆栈,PSP 为进程堆栈,处理模式总是使用 MSP 作为堆栈,线程模式可以选择使用 MSP 或 PSP 作为堆栈,同样通过 CONTROL 特殊寄存器控制。复位后,Cortex-M 默认进入线程模式、特权级、使用 MSP 堆栈。

CONTROL寄存器定义如下:  

 

中断栈

  •  在中断处理过程中,在系统响应中断前,软件代码(或处理器)需要把当前线程的上下文保存下来(通常保存在当前线程的线程栈中),再调用中断服务程序进行中断响应、处理;
  • 在进行中断处理时,中断处理函数中很可能会有自己的局部变量,这些都需要相应的栈空间来保存,所以中断响应依然需要一个栈空间来做为上下文,运行中断处理函数。中断栈可以保存在打断线程的栈中,当从中断中退出时,返回相应的线程继续执行;
  • RT-Thread 采用的方式是提供独立的中断栈,即中断发生时,中断的前期处理程序会将用户的栈指针更换到系统事先留出的中断栈空间中,等中断退出时再恢复用户的栈指针。这样中断就不会占用线程的栈空间,从而提高了内存空间的利用率,且随着线程的增加,这种减少内存占用的效果也越明显。
  • 在 Cortex-M 处理器内核里有两个堆栈指针,一个是主堆栈指针(MSP),是默认的堆栈指针,在运行第一个线程之前和在中断和异常服务程序里使用;另一个是线程堆栈指针(PSP),在线程里使用。在中断和异常服务程序退出时,修改 LR 寄存器的第 2 位的值为 1,线程的 SP 就由 MSP 切换到 PSP。保证我们从异常返回时是从PSP中的POP出来的数据到寄存器里,而不是从MSP中POP。

为什么会写LR寄存器的bit2为1呢?LR不是链接寄存器吗?查看Cortex-M系列权威指南有这样一句话The processor saves an EXC_RETURN value to the LR on exception entry. The exception mechanism relies on this value to detect when the processor has completed an exception handler. When the processor loads a value matching this pattern to the PC it detects that the operation is not a normal branch operation and, instead, that the exception is complete. As a result, it starts the exception return sequence. Bits[6:0] of the EXC_RETURN value indicate the required return stack, processor mode, and stack frame as the following table shows.

EXC_RETURN的定义如下图:

 

总结:采用的双独立栈的设计,即中断发生时,中断的前期处理程序会将用户的栈指针更换到系统事先留出的中断栈空间中,等中断退出时再恢复用户的栈指针。这样中断就不会占用线程的栈空间,从而提高了内存空间的利用率,且随着线程的增加,这种减少内存占用的效果也越明显。

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。 阅读详情

相关推荐

Cortex-M3双堆栈机制与RTOS任务切换原理

在嵌入式实时操作系统(RTOS)中,任务上下文切换的可靠性高度依赖处理器底层堆栈管理机制。Cortex-M3硬件原生支持MSP(主堆栈指针)与PSP(进程堆栈指针)双堆栈架构,通过CONTROL寄存器协同运行模式(Thread/Handler)和特权等级(Privileged/User),实现内核与用户任务的堆栈隔离与故障域划分。该机制不仅提升系统鲁棒性,还为PendSV异常驱动的确定性任务切换提供硬件基础。典型应用场景包括ARM Cortex-M系列MCU上的FreeRTOS、RT-Thread等轻量级R

weixin_35826166的博客 92

任务切换的堆栈细节,你懂?

我们知道 Cortex-M3 系列单片机内部有双堆栈机制。即 Cortex‐M3 拥有两个堆栈指针:主堆栈(MSP)和进程堆栈(PSP)。任一时刻只能使用其中的一个。通过控制寄存器 CONTROL 中的选择位进行控制。两个堆栈指针如下:主堆栈指针( MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)进程堆栈指针( PSP):由用户的应用程序代码使用。将RTO...

嵌入式Linux 1507

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

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

weixin_29207439的博客 420

了解Cortex-M3双堆栈MSP和PSP

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

billxin2012的专栏 2802

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

本文深入解析FreeRTOS任务切换的核心机制,重点探讨ARM Cortex-M3的双堆栈架构与PendSV异常处理。通过详细分析MSP与PSP的隔离设计、PendSV的延迟切换特性以及EXC_RETURN的自动上下文恢复,揭示实时操作系统高效任务调度的底层原理,并提供实用的调试技巧与性能优化方法。

weixin_32924297的博客 352

Cortex-M3

Cortex-M3寄存器、存储器映射、堆栈、异常和中断处理、指令系统

daybydayby的博客 627

嵌入式学习之旅:STM32F103 第二篇(CM3基础)

随着技术的进步,用户的要求越来越苛刻,一方面希望嵌入式CPU具有,另一方面又希望它具有。以Cortex-M3为内核的ARM处理器全面满足了用户的这些需求,一些原本要借助实现的高级功能也能在CM3上流畅运行,同时他的使用与调试过程也极为方便,这些使它在市场竞争中脱颖而出。CM3在不仅技术上是先进的在商业上也构建了极为成功的生态系统。英国的ARM公司只负责设计CM3内核,采用IP授权的方式,由合作伙伴根据不同的应用领域加入适当的外围电路,生产出自己的微处理器芯片进入市场。

xxr13的博客 3491

Cortex-M3编程模型核心解析:工作状态、寄存器与双堆栈机制

嵌入式处理器编程模型是连接C代码与硬件执行的关键抽象层,其核心涵盖工作状态切换、寄存器架构、异常响应流程及内存访问规则等基础机制。ARM Cortex-M3采用Thumb-2指令集与严格自然对齐的内存访问策略,通过硬件强制的字节/半字/字对齐保障总线效率,规避HardFault风险;其双堆栈机制(MSP/PSP)与CONTROL寄存器协同实现特权级分离,为RTOS多任务调度提供确定性上下文切换能力。该模型直接支撑FreeRTOS等实时操作系统在STM32等MCU上的安全、高效运行,是嵌入式固件开发、中断调试

weixin_42610010的博客 38

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

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

weixin_42186015的博客 590

STM32双堆栈及其在uCOS-II中的使用

STM32双堆栈及其在uCOS-II中的使用

【TI毫米波雷达】IWR6843AOPEVM-G与DCA1000EVM实战:从硬件连接到数据流解析

本文详细解析了TI毫米波雷达开发套件IWR6843AOPEVM-G与DCA1000EVM的硬件连接、模式配置及数据流处理全流程。针对官方手册中的常见配置错误,提供了避坑指南和实测验证的正确设置方法,包括开关配置、网络参数等关键步骤。通过mmWave Studio软件配置雷达参数,并深入解析数据采集与处理流程,帮助开发者高效实现毫米波雷达应用开发。

weixin_30653023的博客 368

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

嵌入式系统中,堆栈管理是RTOS实现多任务调度的基础。Cortex-M3处理器采用主堆栈指针(MSP)和进程堆栈指针(PSP)的双堆栈设计,通过CONTROL寄存器实现模式切换。这种机制在RTOS任务切换中发挥关键作用:异常处理时自动保存上下文到PSP,PendSV异常中完成寄存器保存与恢复。理解MSP/PSP切换原理、EXC_RETURN机制以及堆栈对齐优化等技巧,能有效提升系统稳定性并优化15%以上的切换性能。该设计广泛应用于实时控制系统,结合MPU保护可预防堆栈溢出等常见问题。

weixin_33608403的博客 260

CTFShow萌新区全攻略:从密码破解到Web渗透的实战解析

本文为CTFShow萌新区新手提供从密码破解到Web渗透的完整实战攻略。文章深入解析了密码学、隐写术、杂项和Web安全四大核心方向,分享了实用的解题工具、思维方法和绕过技巧,旨在帮助初学者建立系统的安全竞赛解题体系,而不仅仅是提供一份题解(WP)。

weixin_29216957的博客 299

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

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

weixin_30254435的博客 360

Halcon像素比例标定(误差大)-相机标定

一种简易标定: 像素比例标定,如果需要精确一些则需要在高度和宽度上都需要计算,然后求出比例系数。需要高精度标定板和相机,以及多次标定才能达到稳定的状态,这种标定简单,但是误差大。 read_image (Img0008, 'D:/00项目代码/000视觉软件/02Halocn算法20190501/04测量20190424/07_比例计算测量标定/IMG0008.jpg') rgb1_to_...

SSSS的博客 3984

从零构建企业级多智能体系统:LangGraph 全流程实战 + 部署指南(含代码与架构图)

> 在大模型应用爆发的今天,如何构建一个可协作、可调试、可部署的多智能体系统?LangGraph 正在成为工程师的新宠。本文从原理剖析、流程建模、代码实战到前后端部署,手把手带你用 LangGraph 构建一个企业级 AI 助理系统,整合财务分析、法务审阅、报告生成与图表可视化等 Agent 模块,全面打通从用户输入到报告输出的全链路闭环。适合有工程思维的 AI 架构师、Agent 研发人员、以及大模型项目实践者。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3450

linux解析任务堆栈方法,浅识Cortex-M3 的双堆栈机制

CM3 的堆栈分为两个:主堆栈和进程堆栈。那么,这两个栈分别在什么情况下使用呢?这时,我们看一下CM3的控制寄存器(CONTROL):控制寄存器用于定义特权级别,还用于选择当前使用哪个堆栈指针。CONTROL[1]在 Cortex‐M3 的 handler 模式中, CONTROL[1]总是 0。在线程模式中则可以为 0 或 1。仅当处于特权级的线程模式下,此位才可写,其它场合下禁止写此位。改变处...

weixin_31775717的博客 371

RT-Thread Studio使用笔记(四):带片外Flash(W25Q128)的OTA(YModem)

前言 在学习OTA之前,请先参考上两篇博客写的关于SPI设备及W25Q128的使用方法,传送门: https://blog.youkuaiyun.com/tigerots/article/details/107423633 https://blog.youkuaiyun.com/tigerots/article/details/107933991 如何使用OTA 一. 制作BootLoader 打开Bootloader 在线获取地址,注册,并根据RT-thread官方文档生成BootLoader,官方文档已经写的很清楚,再此

tigerots的专栏 4008

再识Cortex-M3之堆栈

寄存器组Cortex-M3拥有通用寄存器R0-R15以及一些特殊功能寄存器。R0-R12是最”通用目的“的,绝大多数的16位指令只能使用R0-R7,而32位的Thumb-2指令则可以访问所有的通用寄存器。特殊功能寄存器必须通过专用的指令来访问。 通用目的寄存器R0-R7 R0-R7称为低组寄存器。所有指令都可以访问,R8-R12称为高组寄存器,只有很少的16位Thumb指令能访问他们,32位的T

廖旭 廊坊师范学院信息技术提高班第十一期 5050

ROS2 多机器人导航仿真入门教程(一)

RMF 是建立在 ROS 2 基础上的一系列可重复使用、可扩展的库和工具,可实现任何类型机器人系统的异构机群的互操作性。RMF 利用标准化的通信协议与部署机器人的基础设施、环境和自动化系统进行通信,以优化关键资源(如机器人、电梯、门、通道等)的使用。它通过资源分配和通过 RMF 核心(将在本书后面详细介绍)防止共享资源冲突,从而为系统增加智能。RMF 灵活而强大,几乎可以在任何通信层上运行,并与任何数量的物联网设备集成。RMF 的架构设计允许随着环境自动化水平的提高而扩展。

2506_90492529的博客 1659

金融领域强化学习在高频交易中的应用

强化学习(Reinforcement Learning,简称RL)是一种机器学习范式,通过智能体与环境的交互来学习策略,以最大化累计奖励。与监督学习和无监督学习不同,强化学习依赖于动态的反馈机制,智能体通过试错不断优化决策过程。高频交易(High-Frequency Trading,简称HFT)是指在极短时间内进行的大量金融交易,通常利用算法和计算机系统自动执行交易策略。高频交易依赖于高速的数据处理和决策能力,以捕捉市场中的微小价格波动。状态(State):环境在某一时刻的观测,反映了系统的当前情况。

AI天才研究院 893

[转]再识Cortex-M3之堆栈

原地址https://blog.youkuaiyun.com/liaoxu02/article/details/48107651 Cortex-M3拥有通用寄存器R0-R15以及一些特殊功能寄存器。R0-R12是最”通用目的“的,绝大多数的16位指令只能使用R0-R7,而32位的Thumb-2指令则可以访问所有的通用寄存器。特殊功能寄存器必须通过专用的指令来访问。通用目的寄存器R0-R7R0-R7称为低组寄...

weixin_30340353的博客 347

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Cortex-M3双堆栈MSP和PSP

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

zhaodong1102的博客 6527

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: Linux设备驱动学习三 设备节点的生成和调用:杂项设备驱动的注册和调用
下一篇: RT-Thread使用CmBacktrace进行HardFault_Handler 追踪
逐梦,无惧!
博客等级 码龄16年 8843粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值