Cortex-M3/M4堆栈

news2024/11/23 9:38:18

一、Cortex-M3/M4堆栈操作

Cortex-M3/M4 使用的是“向下生长的满栈”模型。堆栈指针 SP 指向最后一个被压入堆栈的 32 位数值。在下一次压栈时, SP 先自减 4, 再存入新的数值,如图所示为堆栈的PUSH操作。

 POP 操作刚好相反:先从 SP 指针处读出上一次被压入的值,再把 SP 指针自增 4。

在进入 ISR 时, CM3/CM4 会自动把一些寄存器压栈,这里使用的是进入 ISR 之前使用的 SP 指针(MSP 或者是 PSP)。离开 ISR 后,只要 ISR 没有更改过 CONTROL[1],就依然使用先前的SP 指针来执行出栈操作。

二、双堆栈操作

CM3/CM4 的堆栈是分为两个:主堆栈和进程堆栈, CONTROL[1]决定如何选择。

当CONTROL[1]=0 时,只使用 MSP,此时用户程序和异常 handler 共享同一个堆栈。这也是复位后的缺省使用方式,如图所示。

当 CONTROL[1]=1 时,线程模式将不再使用 PSP,而改用 MSP(handler 模式永远使用MSP)。此时,进入异常时的自动压栈使用的是进程堆栈,进入异常 handler 后才自动改为MSP,退出异常时切换回 PSP,并且从进程堆栈上弹出数据,如图所示。

 在特权级下,可以指定具体的堆栈指针,而不受当前使用堆栈的限制,示例代码如下:

MRSR0,MSP; 读取主堆栈指针到 R0
MSRMSP,R0; 写入 R0 的值到主堆栈中
MRSR0,PSP; 读取进程堆栈指针到 R0
MSRPSP,R0; 写入 R0 的值到进程堆栈中

通过读取 PSP 的值, OS 就能够获取用户应用程序使用的堆栈,进一步地就知道了在发生异常时,被压入寄存器的内容,而且还可以把其它寄存器进一步压栈的书写形式)。 OS 还可以修改 PSP,用于实现多任务中的任务上下文切换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1034292.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电子信息工程专业课复习知识点总结:(五)通信原理

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 第一章通信系统概述——通信系统的构成、各部分性质、性能指标1.通信系统的组成?2.通信系统的分类?3.调制、解调是什么?有什么用…

MySQL详解六:备份与恢复

文章目录 1. 数据库备份的分类1.1 从物理和逻辑上分类1.1.1 物理备份1.1.2 逻辑备份 1.2 从数据库的备份策略角度上分类1.2.1 完全备份1.2.2 差异备份1.2.3 增量备份 1.3 常见的备份方法 2. MySQL完全备份2.1 完全备份简介2.2 优点与缺点2.3 实现物理冷备份与恢复2.3.1 实现流程…

备受以太坊基金会青睐的 Hexlink,构建亿级用户涌入 Web3的入口

早在2021年9月,以太坊创始人Vitalik Buterin就曾提出了EIP-4337(账户抽象)提案,并在去年10月对该提案进一步更新,引发行业的进一步关注。在今年3月,EIP-4337提案正式通过审计,并成为了ERC-4337标…

conda常用指令

常用conda指令 查看当前有哪些环境,有base环境 conda env list 创建环境 # conda create -n 你的环境名 python版本号 # 创建python3.10,名为env虚拟环境 conda create -n env python3.10 激活环境 conda activate env

java框架-Spring-AOP

AOP:动态代理 开发步骤: 导入aop模块定义业务逻辑类定义切面类; -. 切面类标注:Aspect -. 切面类注解: Before: 前置通知, 在方法执行之前执行 After: 后置通知, 在方法执行之后执行 。 AfterRunning: 返回通知, 在方法返回结果之…

[杂谈]-快速了解半波和全波整流

快速了解半波和全波整流 文章目录 快速了解半波和全波整流1、滤波2、半波整流器3、全波整流器4、常见问题 整流器是一种将交流信号转换为脉动直流信号以及将交流电转换为直流电的电子电路。 我们日常生活中几乎所有的电子项目都会用到它。 根据周期传导,本文我们介绍…

【Python】ModuleNotFoundError: No module named ‘Crypto‘

今天在使用一个新的库Crypto时发生了报错 Crypto安装成功~ 导入Crypto模块也没有问题 运行时却发生了报错: 没有这个模块? 我明明安装成功了,为什么报错没有这个库呢? 于是我去查看了一下是不是没有安装上呢? 为什么…

sql注入挖掘

出现的条件 只要是和数据库有交互 没有过滤拼接的sql语句可以执行 判断 这个是在url筐里的

想要精通算法和SQL的成长之路 - 双指针【数组】

想要精通算法和SQL的成长之路 - 双指针【数组】 前言一. 合并两个有序数组二. 删除有序数组中的重复项 II 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 合并两个有序数组 原题链接 抓住重点信息: 两个数组都是非递减顺序排列。num1数组,末尾包…

在Bat To Exe Converter,修改为当异常结束或终止时,程序重新启动执行

在Bat To Exe Converter,修改为当异常结束或终止时,程序重新启动执行 .bat中的代码部分: .bat中的代码echo offpython E:\python\yoloProjectTestSmallLarge\detect.pypause,我想你能帮在Bat To Exe Converter,修改成…

JAVA入坑之嵌套类

一、嵌套类入门 1.1概述 Java嵌套类是指在一个类中定义另一个类的一种方式,它可以提高代码的可读性、可维护性和封装性。Java嵌套类分为两种类型:静态嵌套类和非静态嵌套类。 静态嵌套类:Static nested classes,即类前面有static修饰符 非静…

【进阶C语言】字符串与内存库函数认识与模拟实现

本章内容大致目录: 1.strlen函数 2.strcpy函数 3.strcmp函数 4.strcat函数 5.strstr函数 6.strtok函数 7.strerror与perror函数 8.字符操作函数 9.内存操作函数 10.总结 以上函数均属于库函数,有的函数则会介绍如何模拟实现。 一、strlen函数…

conda创建虚拟环境安装aix360

目录 创建虚拟环境查看已有虚拟环境进入所创建的虚拟环境查看已安装的程序查看已安装的python模块配置镜像pipconda 安装aix360将环境添加到jupyter删除虚拟环境 创建虚拟环境 建议装python3.7python3.7python3.7python3.7python3.7python3.7python3.7python3.7python3.7pytho…

YTM32的LIN通信协议引擎LinFlexD外设模块详解

YTM32的LIN通信协议引擎LinFlexD外设模块详解 文章目录 YTM32的LIN通信协议引擎LinFlexD外设模块详解LINFlexD外设简介LINFlexD工作机制初始化主机模式从机模式错误状态标志位超时错误(Timeout Error)ID过滤机制接收器检测帧间隔段和帧间隔段分隔符产生波…

[游戏开发][Shader]GLSLSandBox转Unity-CG语言

官网 GLSL Sandbox Galleryhttps://glslsandbox.com/ 屏幕坐标计算 fragCoord与_ScreenParams mat2矩阵转换 vec2向量 在GLSL里mat2(a, b, c, d)函数返回vec2但是在CG语言里 没有mat2函数,用下面的值替换mat2方法vec2(a * 1. c * 1., b * 1. d * 1.);举例&…

一台电脑远程内网的另外一台电脑,禁止远程的电脑连接外网,只允许内网连接

一台电脑远程内网的另外一台电脑,禁止远程的电脑连接外网,只允许内网连接 1.找到右下角网卡图标,右键图标选择“打开网络和共享中心”。 3、点击“更改适配器设置”。 4、右键正在使用的网卡“本地连接”打开属性 5、找到“internet协…

vue简单案例----小张记事本

小张记事本 具体效果如图所示&#xff0c;这里就简单展示&#xff0c;还有很多不足的地方&#xff0c;希望大家可以对这个小项目进行改进&#xff0c;话不多说可以参考下面的代码 源代码如下 <html lang"en"><head><meta charset"UTF-8"…

1786_MTALAB代码生成把通用函数生成独立文件

全部学习汇总&#xff1a; GitHub - GreyZhang/g_matlab: MATLAB once used to be my daily tool. After many years when I go back and read my old learning notes I felt maybe I still need it in the future. So, start this repo to keep some of my old learning notes…

1400*C. No Prime Differences(找规律数学)

解析&#xff1a; 由于 1 不是质数&#xff0c;所以我们令每一行的数都相差 1 对于行间&#xff0c;分为 n、m之中有存在偶数和都为奇数两种情况。 如果n、m存在偶数&#xff0c;假设m为偶数。 如果都为奇数&#xff0c;则&#xff1a; #include<bits/stdc.h> using name…

解决0-1背包问题(方案二):一维dp数组(滚动数组)

往期文章&#xff1a;解决0-1背包问题&#xff08;方案一&#xff09;:二维dp数组_呵呵哒(&#xffe3;▽&#xffe3;)"的博客-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/133207350?spm1001.2014.3001.5501 >>探索一维dp数组和二维dp数组的…