当前位置: 首页 > news >正文

ARM 异常处理(21)

异常的流程:

首先: 在硬件上阶段: 这里是4大步3小步

然后是      异常处理: 这里主要是保存现场,进行异常处理

然后是      异常返回:  主要指 恢复现场, 再跳转回去。

首先硬件上:

4大步3小步。

第一大步: 当异常发生时,会将 CPSR的内容保存到目前模式的SPSR中,不知道需不需要手动执行。

第二大步: 第一小步,硬件会自动的设置 异常的类型,主要是设置 CPSR的 0-4 位,第二小步, 然后切换到arm 状态下,就是硬件自动设置 CPSR的 第5位 为0 , 第三小步,同时cpu 会自动的关闭CPSR的 中断, 也就是设置I位。

第三大步: 在进入异常处理之前,硬件会自动的将当前的PC的值减4 放到LR中。(它的作用是,将来会将LR的值,赋值到PC中,这里在赋值到PC中,LR的值, 会由于异常的类型的不同,计算的方法也不同)。

第四大步: 硬件会自动的跳到 中断向量表,中断向量表只是保存了一个 跳转的地址。cpu 根据异常的类型跳转到 固定的内存地址。

异常向量表如图

异常处理:

保存现场,进行处理。

在异常处理的最开始, 需要先要保存现场,

STMFD  SP_excep!,  {R0 – R12,  LR_excep}

这是将所有的寄存器全都保存到了栈中 。

包括 LR的值。

然后就开始进行 中断处理了。

注意: 这里的栈 , 是对应的异常模式的栈。

然后是异常的返回

首先是将 保存在栈中的 现场 全部恢复到 寄存器中

然后将SPSR 恢复到 CPSR中。

然后将 LR的值, 赋值到PC中,这里 有一个如何计算的问题。这里就是在 返回地址的修正。

对于 中断的话,是这样的。

SUBS    PC,LR_irq,#4  ; 一般中断
SUBS    PC,LR_fiq,#4  ; 快速中断

 这是因为,当中断处理时, PC的值已经更新了,所以PC指向的是, 当前指令,往下数3条指令,硬件会自动的 将PC-4的值,保存到LR中,我们之前已经将LR保存到栈中,现在又从栈中取出了LR的值, 现在还要再-4 才能赋值到PC中。

对于SWI 异常来说,当异常发生时,PC的值还未更新,它指向的是,当前指令的向下两条指令,由于硬件自动的将PC-4 保存到LR中了,所以这里就不用动了。指令如图:

MOV  PC,  LR_svc

其他的异常就可以先不看了。

在进行 寄存器恢复的时候,使用的命令。

LDMFD  SP_excp!,  {r0-r12,  pc}^

注:SP_excep为对应异常模式下SP,^符号表示恢复SPSR_excep到CPSR。

中断向量表 可以通过协处理器, 定位到 0xFFFF0000 处。

至于 中断做什么 可以由我们指定了。

http://www.lryc.cn/news/431507.html

相关文章:

  • 我开源了我的新闻网站项目
  • LlamaIndex 使用 RouterOutputAgentWorkflow
  • 设计模式学习-责任链模式
  • 【全网最全】2024年数学建模国赛B题31页完整建模过程+成品论文+matlab/python代码等(后续会更新
  • 第二十一届华为杯数学建模经验分享之资料分享篇
  • 使用 OpenSSL 创建自签名证书
  • EmguCV学习笔记 VB.Net 9.1 VideoCapture类
  • Rspack 1.0 发布了!
  • 【全网最全】2024年数学建模国赛E题超详细保奖思路+可视化图表+成品论文+matlab/python代码等(后续会更新
  • 数智转型,看JNPF如何成为企业的必备工具
  • ArcGIS Pro 发布松散型切片
  • 奖项再+1!通义灵码智能编码助手通过可信 AI 智能编码工具评估,获当前最高等级
  • 如何使用 yum 在 CentOS 6 上安装 nginx
  • F12抓包05:Network接口测试(抓包篡改请求)
  • OPenCV结构分析与形状描述符(4)计算一个旋转矩形的四个顶点的函数boxPoints()的使用
  • 【Matplotlib】利用Python进行绘图!(python数据分析与可视化)
  • 第二百二十节 JPA教程 - JPA 实体管理器删除示例
  • [⁠TypeError⁠]‍ {message: “Cannot read property ‘‘ of undefined“}
  • NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001
  • 项目在运行时,浏览器控制台出现 Uncaught ReferenceError: globalThis is not defined
  • 图中点的层次
  • ansible+awx搭建
  • linux环境下安装配置go环境
  • 可交互、会学习、自成长机器人——李德毅院士
  • Redis发布订阅PUB/SUB
  • Scratch教师节 —— 感恩教师节
  • 【60天备战软考高级系统架构设计师——第五天:需求分析方法与工具】
  • 【Hot100算法刷题集】哈希-01-两数之和(暴力枚举再优化,也不是哈希表的对手)
  • 基于.NET6的WPF基础总结(上)
  • Nuxt3入门:资源文件(第2节)