干货 | 关于Armv7m异常进入的经验分享

一、 概述

这里主要介绍异常的进入行为(不包括复位异常)。(这里主要参考 armv7m)。

二、异常进入

在发生抢占的时候(异常发生且开始执行),硬件将上下文状态保存到一个 SP 寄存器指向的栈中,使用的堆栈取决于异常发送时处理器的模式。

在 armv7m 中使用 全降序栈,也就是压栈的时候 SP 地址递减,出现的时候 SP 指针递增

        压栈的时候,硬件将保存 8 个 32bit 数据,包括 xPSR、ReturnAddress、LR、R12、R3、R2、R1、R0。如果存在浮点扩展,那么还会将 FP 状态压入栈或者仅为状态保留空间(状态指 S0~S15 和 FPSCR)

        异常进入行为如下:/*如果在压栈期间出现故障,PushStack 能放弃内存访问,然后会根据派生异常决定下一步行为*/

ExceptionEntry(integer ExceptionType):

PushStack(ExceptionType);

ExceptionTaken(ExceptionType);

2.1 压栈

(1)检查是否有 FP 扩展且是否 active FP扩展,如果有,压栈需要 104 字节且栈强制 8 字节对齐;如果没有,压栈 32字节,对齐根据 CCR.STKALIGN

(2)检查当时使用 SP 是 PSP 还是 MSP,当前使用那个就会在哪一个里面进行压栈,压栈值如下:
          如果没有 FP 状态需要压栈,那么就仅压栈 R0~R3、R12、LR、 ReturnAddress(也就是在异常返回时候要返回的地址) 和 ( XPSR<31:10>: frameptralign:XPSR<8:0>)
          如果有 FP 状态需要压栈,则 还需要 预留 S0~S15、FPSCR 的空间,根据  FPCCR.LSPEN 看是否要压栈还是仅仅是预留,等于 0 说明 FP 状态也要一起压栈,等于 1表示仅仅预留改空间,但不将数据写入

(3)对于 LR 寄存器,这里存的是 是否启用了 FP 扩展和 使用的是 MSP 亦或 PSP 信息,用于后续的返回,也就是  EXC_RETURN 值

注意:关于 ReturnAddress。如果是同步异常,那么会返回到未进入异常时候执行的地址,但如果是异步异常,那么就会返回到下一个地址

如下,是无 FP 扩展的压栈过程,这里上下文状态称为基本帧(这里以 8 字节对齐为例)

  (图片来着 ARM:《DDI0403E_d_armv7m_arm.pdf》)

以下是有 FP 扩展的压栈过程,这里上下文状态称为扩展帧(这里以 8 字节对齐为例)

(图片来着 ARM:《DDI0403E_d_armv7m_arm.pdf》)

        如上,是异常进入压栈的过程。

2.1.1 压栈对齐

        首先是栈指针是 4/8 字节对齐(如果没对齐会在压栈这里对齐),在将 PSR 压栈的时候,使用 PSR[9] 指示是否有重新对齐栈(正常情况下这个位是保留的,1表示栈有重新对齐过,后续会与 EXC_RETURN[4] 联合确定 SP 是否经过调整)。如果有 FP 扩展且使用了改扩展,强制使用 8 字节对齐。

        对于有 FP 扩展的,压栈上实现了三种模式:(CONTROL.FPCA、FPCCR.ASPEN 和 FPCCR.LSPEN 决定了哪种模式,该寄存器只有特权模式才能访问):

(1)栈不保存 FP 状态,只压入基本栈(CONTROL.FPCA=0)

(2)栈按照扩展帧保留空间,但只写基本帧信息(FPCCR.LSPEN =1 且CONTROL.FPCA=1或FPCCR.ASPEN=1),如果后续软件处理尝试会用到 FP 指令,那么就会将 FP 状态保存到保留的空间,然后将 FPCCR.LSPACT 设置为 0

(3)栈写入扩展帧数据(FPCCR.LSPEN =0 且CONTROL.FPCA=1或FPCCR.ASPEN=1)

注意:在没有 FP 扩展使能的情况下,如果使用的是 8 字节对齐,在进入到退出的过程中将 CCR.STKALIGN 设置为 0,且 SP 进入时候不是 8 字节对齐,那么可能会导致系统损坏。

2.2 异常执行

(1)设置 PC 值,指向 异常处理函数入口,这里仅仅只是设置 PC 值而已,还没执行

(2)将模式改为 Handler

(3)将异常向量号写入 IPSR

(4)禁用 FP 扩展,使用 MSP

(5)将该向量号设置为激活状态

2.3 故障调试

        从上面可以看出,在进入 故障 ISR 之后,其实如 LR、PSR 这些寄存器可参考意义相对较小,但我们仍旧可以在这里获取当前异常类型(IPSR)和栈顶(SP,在无 SP 溢出和其他会对栈数据进行破坏情况下)

        通过 SP 指针,我们可以找到压栈的数据,这里有 ReturnAddress 数据可以让我们清楚的知道运行到那个地址出现了该错误。

        通过获取当前的异常类型,可以知道是那种异常进入了处理。如果是故障,还可以 SCS 里面的 CFSR、HFSR、MMFAR、BFAR、AFSR、

三、参考文档

ARM:《DDI0403E_d_armv7m_arm.pdf》

欢迎登录大大通,了解更多精彩内容!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优化|贝叶斯优化系列(二):大规模贝叶斯优化算法

原文&#xff1a;When Gaussian Process Meets Big Data: A Reviewof Scalable GPs 原文作者&#xff1a;Haitao Liu , Yew-Soon Ong 论文解读者&#xff1a;赵进 编者按 高斯过程模型因其出色的预测性能在仿真建模中得到了广泛应用&#xff0c;然而在当今大数据时代&#xf…

百度翻译与TOP3在线翻译伙伴:2024年的黄金组合

在这个信息丰富的时代&#xff0c;语言帮助人们跨越地域界限进行交流。随着全球化的发展&#xff0c;高效的在线翻译工具变得越来越重要&#xff0c;它能帮我们更好地了解世界和不同的文化。今天&#xff0c;我们就来看看百度翻译和它的三个新对手之间的比较&#xff0c;一起找…

Codeforces Round 916 (Div. 3) E1. Game with Marbles(博弈论*1400)

感觉很难想。 如果你直接想的话&#xff0c;你就会发现有很多做法可以选择&#xff0c;而你根本不知道应该选哪个。 这时候可以先假设鲍勃已经取走了爱丽丝的所有的颜色的弹珠&#xff0c;&#xff08;并且以每个颜色一个弹珠的代价&#xff09;。 这时候每一项得分就是 S i …

Dubbo 内置容器:Spring Container

Dubbo 内置容器&#xff1a;Spring Container 1、核心点2、误解澄清 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; Dubbo本身并不直接提供容器服务&#xff0c;而是深度集成了Spring框架&#xff0c;实现了对Spring Container的全面支持。…

游戏开发设计模式之原型模式

目录 原型模式的实现步骤 原型模式的优点 原型模式的应用场景 总结 原型模式在游戏开发中的具体应用案例是什么&#xff1f; 如何在不同编程语言中实现原型模式&#xff1f; Java C# Python C JavaScript 原型模式与其他创建型设计模式&#xff08;如建造者模式、适…

Modern restaurant - building and interior (餐厅场景)

餐厅是模块化的,因此您可以使用提供的构造元素(如墙壁模块、地板模块、窗户、吧台、厨房模块、门、天花板模块等)进一步设计自己的餐厅。 图像和视频中显示的完整场景包含在此资源包中,可以用作游戏和3D项目的起点! ★ 主要特点 ★ 全模块化内饰和外观 全模块化厨房和餐厅…

PTA统计一行文本的单词个数

本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串&#xff0c;各单词之间用空格分隔&#xff0c;空格数可以是多个。 输入格式: 输入给出一行字符。 输出格式: 在一行中输出单词个数。 输入样例: Lets go to room 209.输出样例: 5解题…

【惠农网-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

Backtrader 实现和理解海龟交易法

Backtrader 实现和理解海龟交易法 1. 海龟交易的理解 &#xff08;1&#xff09;资金管理 海龟将总资金分为N个交易单位&#xff0c;每个单位即称为头寸&#xff0c;划分的标准主要是参考标的的波动性。 波动性用一个指标量化即真实波动幅度均值&#xff08;ATR&#xff09;…

C_05_编译4阶段

c语言编译的4个阶段&#xff1a;预处理、 编译、 汇编、 链接 预处理阶段会在源代码中查找预编译指令&#xff0c;其中主要是头文件展开&#xff08;include)&#xff0c;宏定义&#xff08;defind&#xff09;&#xff0c;选择性编译&#xff08;ifdef&#xff09;三种指令 预…

mybatis-plus添加replace(自定义)方法,添加sql注入器SqlInjector

1. 继承DefaultSqlInjector import com.baomidou.mybatisplus.core.injector.AbstractMethod; import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; import com.baomidou.mybatisplus.core.metadata.TableInfo; import org.springframework.stereotype.Compon…

Qt_信号槽机制

文章目录 Qt中的信号槽机制1.在widget.h添加处理函数的声明2.添加处理函数的定义3.建立信号和槽的连接4.运行 Qt中的信号槽机制 本质就是给按钮的点击操作&#xff0c;关联上一个处理函数&#xff0c;当用户点击的时候&#xff0c;就会执行这个处理函数。 函数&#xff1a;stat…

Upscayl 采用开源人工智能技术,可以增强低分辨率图像的效果。

Upscayl 是一款免费开源的基于 AI 神经网络与深度学习的「图片画质提升 / 超分辨率软件」&#xff0c;可以做到“无损放大图片”&#xff0c;让你轻松将任意分辨率的图片、照片、壁纸放大到高清、超清甚至 4K 水平&#xff0c;大幅提升图片细节表现与清晰度&#xff01;效果比起…

用Python实现时间序列模型实战——Day 2: 时间序列的基本统计量

一、学习内容 1. 自相关函数 (ACF) 与偏自相关函数 (PACF) 自相关函数 (ACF)&#xff1a; 自相关函数用于衡量时间序列在不同时间滞后下的相关性。它描述了序列与自身滞后版本之间的相关性&#xff0c;滞后时间越长&#xff0c;相关性通常会减弱。自相关函数的计算公式为&am…

浏览器 V8 引擎

V8 引擎是 Google 开发的高性能 JavaScript 和 WebAssembly 引擎&#xff0c;最初是为了提升 Google Chrome 浏览器的性能而设计的。自 2008 年首次发布以来&#xff0c;V8 引擎不仅仅被用在 Chrome 浏览器中&#xff0c;还被广泛应用于其他 JavaScript 环境中&#xff0c;比如…

嵌入式系统课后习题(带答案)

资料截图&#xff08;部分&#xff09;&#xff1a; &#x1f680; 获取更多详细资料可点击链接进群领取&#xff0c;谢谢支持&#x1f447; 点击免费领取更多资料

前端通过draggable结合fabricjs实现拖拽至画布生成元素自定义编排功能

前端通过draggable结合fabricjs实现拖拽自定义编排功能 太久没有更新了&#xff0c;主要最近行情不太好失业了一段时间&#xff0c;一度到怀疑人生&#xff0c;然后就是做的东西大多没有什么含金量&#xff0c;没什么好分享的就很尴尬。 刚好最近遇到一个奇葩的需求&#xff0…

【李林880-2025版本】个人错题01 第十六章节——喻老讲解版

十六章 这里需要注意的是三个设的变量都要满足的不等式条件 根据题目的最长中间的一段需要满足大于其他两个变量的不等式条件 最后根据几何概型方法求出概率 两个情况 重要思想[逆事件] &#xff1a;7个正品找到了3个次品都找到了 这里首先从六个空中选出两个次品位置&…

《Web项目跨域请求后端Api设置Cookie失败问题?》

问题描述&#xff1a; 在web项目中跨域请求api时&#xff0c;api登录成功后需要向域名中设置cookie实现在两个域名下共享&#xff0c;但是登录接口返回成功&#xff0c;响应头中也有set-cookie&#xff0c;实际却无法设置到cookie中… web项目访问时的域名https://b.com/ api所…

【HarmonyOS 4.0】@BuilderParam 装饰器

1. BuilderParam 装饰器 BuilderParam 装饰器用于装饰自定义组件(struct)中的属性&#xff0c;其装饰的属性可作为一个UI结构的占位符&#xff0c;待创建该组件时&#xff0c;可通过参数为其传入具体的内容。参数必须满足俩个条件&#xff1a; 2.1 参数类型必须是个函数&#x…