举个小例子,下面是一段ARM汇编代码:

地址

指令

0x3000

BL add

0x3004

MOV r0,#0

0x3008

MOV r1,#1

0x300C

MOV r2,#2

AREA test,CODE,READONLY

ENTRY

Start

MOV r0,#1

MOV r1,#1

BL add

MOV r0,#0

MOV r1,#1

Add

ADD r0,r0,r1

MOV r0,r0,r1

END

当0x3000处的BL指令执行时,会把PC(=0x3008)保存到LR寄存器里面,也就是LR=0x3008。接下来处理器会立即对LR进行一个自动的更新动作:LR=LR-0x4,这样,LR里面的地址为0x3008 – 0x4 = 03004,它是指令”MOV r0,#0”的地址,所以当从子程序add返回时,LR里面正好是正确的返回地址。既是下一条要执行的指令的地址。

(2)中断异常处理函数调用

异常就是正在执行的指令,由于各种软件或硬件故障被打断,比如,在读数据或指令时,访问存储器失败、产生了一个外部硬件中断等。当这些情况发生时,在ARM系统里,由异常和中断处理程序做出相应的处理,当处理完成后,要返回到被中止的指令,使被中止的指令能够继续正常执行下去。因此,确定异常和中断处理程序的返回地址是一个非常重要的问题。

1、中断处理

当外部中断IRQ和FIQ(Fast Interrpt Request,快速中断请求)发生时,ARM核完成一部分工作。当然,这些工作是任何异常发生时都必须要做的,所以ARM处理器就会自动带我们完成。 其它重要的工作,必须由程序员来完成。ARM处理器处理的事包括从用户模式切换到IRQ模式、状态寄存器值的变化及跳转。比如说,处理器自动跳转到从0x0地址开始的异常中断向量表的0x18处,在向量表的0x18处,简单的指令为”B HandlerIRQ”。

那程序员所要关心的就是实现具体的异常处理程序(HandlerIRQ)。当用ARM汇编语言实现HandlerIRQ函数的时候,如何确定HandlerIRQ函数正确地返回地址,使被中止的指令能够继续正常执行下去。

比较常用的中断处理程序结构如下:

HandlerIRQ ;中断响应,从向量表直接跳来

SUB r14,r14,#4 ;计算返回地址

STMFD r13,{r0-r3,r14} ;保护现场,一般只需要保护{r0-r3,lr}

BL irqHandler ;跳到具体的异常处理函数

LDMFD r13,{r0-r3,pc}^ ;恢复现场

有程序可以看出,通过”SUB R14,R14,#4”计算中断函数的返回地址。那有人一定会问,为什么计算返回地址的时候要减去4呢?

地址

指令

0x3000

BL add

0x3004

MOV r0,#0

0x3008

MOV r1,#1

0x300C

MOV r2,#2

我们看上个表,比如在执行地址为0x3004的move指令时,突然来了一个IRQ中断,这个中断打断了move指令的执行,这个时候就要去跳转到异常处理函数,之后还要返回0x3004地址重新执行move指令。当中断发生时,LR里面保存了用户模式下PC的值,那么当执行地址为0x3004的move指令时,PC的值应该是0x300C,前面介绍过,当发生跳转时,处理器会对LR进行一个自动的更新动作:LR=LR-0x4,这样LR里面的地址是0x300C-0x04=0x3008。但是0x3008并不是我们要的地址,因为中断发生在地址为0x3004的move指令执行的时候,所以中断处理完后应该返回这个地址。 这就是在计算返回地址的时候LR减去4的原因。对于FIQ中断和预取指中止异常,计算返回地址方法和IRQ相同。

arm中断保护和恢复_ARM中断异常处理的返回相关推荐

  1. arm中断保护和恢复_ARM中断返回的详细分析

    原标题:ARM中断返回的详细分析 在ARM体系中,通常有以下3种方式控制程序的执行流程: 1.在正常执行过程中,每执行一条ARM指令,程序计数器PC的值加4个字节:每执行一条Thumb指令,程序计数器 ...

  2. arm中断保护和恢复_ARM异常中断的原因及处理措施

    当ARM异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行.当异常中断处理程序执行完成后,程序返回到发生中断指令的下条指令处执 行.在进入异常中断处理程序时,要保存被中断程序的 ...

  3. arm中断保护和恢复_ARM的中断处理详细过程

    ARM有七种异常中断类型,优先级.工作模式(有七种工作模式).地址.功能都不一样.如其中软件中断SWI优先级为6,工作模式管理模式,异常向量地址为0x00000008,功能是用户定义的中断指令,可用于 ...

  4. arm中断保护和恢复_ARM中断处理过程

    以s3c2440 ARM9核为例: 一:s3c2440 ARM处理器特性: 1.S3C2440支持60个中断源,含子中断源: 2.ARM9采用五级流水线方式: 3.支持外部中断和内部中断: 二.s3c ...

  5. arm中断保护和恢复_浅谈ARM处理器的七种异常处理

    昨天的文章,我们谈了ARM处理器的七种运行模式,分别是:用户模式User(usr),系统模式System(sys),快速中断模式(fiq),管理模式Supervisor(svc),外部中断模式(irq ...

  6. arm中断保护和恢复_嵌入式ARM系统异常和中断处理知识总结

    关于异常处理,分为三部分: 1. ARM异常和模式:core处理异常时的操作,几种模式介绍. 2. Vector table: 3. 异常优先级 4. lr偏移:几种异常如何返回 异常和中断处理简介 ...

  7. fiq中断的入口地址_ARM中断模式(IRQ)和快速中断模式(FIQ)区别比较

     概念 IRQ(Interrupt Request):指中断模式. FIQ(Fast Interrupt Request):指快速中断模式. IRQ与FIQ是ARM处理器的两种不同编程模式(ARM有7 ...

  8. 实地址模式与保护模式下的中断与异常处理

    在中断和异常的处理过程中,很重要的一件事是如何识别中断源,获取中断服务子程序的入口地址.在80486 CPU系统中,因为CPU的工作模式不同而获取中断向量的方式有所不同,本节讨论CPU工作在实地址模式 ...

  9. 字符设备驱动笔记——中断方式按键驱动之linux异常处理结构(四)

    1.中断方式获取按键值单片机: 1)按键按下 2)cup发生中断,跳转到异常向量入口执行 3)b 函数a.保存被中断的现场b.执行中断处理函数c.恢复 linux: 1)trap_init()函数构造 ...

最新文章

  1. dos下命令行执行程序时候注意程序所使用文件的路径问题
  2. 批量去除歌曲tag标签
  3. Spring Boot 2.2.1 正式发布,需特别注意这个注解的使用!
  4. GSLX680触摸屏驱动移植
  5. sonarqube7.8汉化教程:安装中文插件
  6. idc机房建设费用_idc机房服务器带宽租用费用
  7. 利用js弹出select下拉选中option的内容
  8. html的页面宽高变形问题,CSS+div 设计的网页在不同浏览器中变形的问题
  9. 计算机控制系统视频关守平,国家级精品课《计算机控制系统》课程建设研讨会顺利召开...
  10. ajax 输入一个整数,jQuery.ajax()仅适用于整数
  11. PHP PDO的简单使用(query(),exec(),prepare(),Transaction,行锁)
  12. maven 打包命令的使用
  13. 计算机电源供电方式,电脑主板开关电源供电方式图文介绍
  14. vue 路由history模式打包部署 The requested URL * was not found on this server. 的解决方法
  15. 原生js完成拼图小游戏
  16. Beyond Compare4中文版免费版上线
  17. 【修真院java小课堂】clean,install,package,deploy分别代表什么含义?
  18. 系统清道夫 android2.1,安卓系统清道夫国际版
  19. Rust 创始人:社区应限制成长速度;电商法 1 月 1 日起实施
  20. php carbon 格式化,Laravel Carbon 简明使用

热门文章

  1. 剑指offer_第7题_斐波那契数列
  2. OpenAI新发现:GPT-3做小学数学题能得55分,验证胜过微调!
  3. 厉害!苏炳添即将在暨南大学成立短跑实验室
  4. 人脑是怎么防止梯度消失和梯度爆炸的?
  5. 一顿火锅钱+一台旧手机 = 自主导航机器人?
  6. 用户组管理之更新分组表数据
  7. 数据科学中必须知道的5个关于奇异值分解(SVD)的应用
  8. 【OpenCV 4开发详解】分割图像——分水岭法
  9. 【OpenCV 4开发详解】图像连通域分析
  10. 第一篇:时间和全局状态