ARM异常中断返回的几种情况

ARM异常中断返回的几种情况
重要基础知识:R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令。一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第一条指令,因此 PC总是指向第三条指令。当 ARM 状态时,每条指令为 4 字节长,所以 PC 始终指向该指令地址加 8 字节的地址,即:PC 值=当前程序执行位置+8;
而 ADS 中的 pc,是为了调试看着方便而修改过的,它指向的是正在执行的指令,即“真正 pc-8”!

1.SWI 和和未定义指令异常中断的返回:
指令地址
A PC-8 当前指令为 SWI 或未定义指令 此时发生中断.PC 的值还没有更新.
A+4 PC-4 中断时处理器将 PC-4 保存到 LR。 ;lr!
A+8 PC

返回时,从发生中断的指令 A(PC-8)的下一条指令 A+4(PC-4)处开始执行,所以直接把 LR 的值赋给 PC 就行了,具体指令为 MOV PC,LR (PC=A+4=LR)
白话解释:对于 SWI 和未定义指令异常: 发生异常时 pc 没有更新,根据 ARM 的三级流水线原理,pc 没有更新,仍然等于(A+8); lr = pc – 4(这时处理器决定的,无法更改!)即 A+4。
由于这类异常返回后应执行下一条指令(A+4),所以返回时,pc = lr 即可。

2.IRQ 和 FIQ 异常中断处理的返回:
指令地址 对应于 PC
A PC-8 执行此指令完成后(!)查询 IRQ 及 FIQ,如果有中断请求则产生中断.
A+4 PC-4
A+8 PC ;lr!
(此时 PC 的值已经更新,指向 A+12.将当前 PC-4,即 A+8 )。
保存到 LR.返回时,要接着执行 A+4(LR-4)处的指令,所以返回指令为
SUBS PC, LR,#4(PC=A+4=LR-4)
白话解释:对于普中断和快中断异常,中断必须在一条指令执行完以后被检测到,如正在执行指令甲时发生了中断,不等指令甲执行完是不会处理该中断的,发生异常时 pc 已经更新(A+12); lr = pc – 4(这时处理器决定的,无法更改!)即 A+8 返回后,应执行被中断而没有执行的指令(上面的 A+4),所以返回时,pc = lr-4

3,指令预取中止异常中断处理的返回:
指令地址
A PC-8 执行本指令时发生中断,
A+4 PC-4 处理器将 A+4(PC-4)保存到 LR. ;lr!
A+8 PC

返回时,发生指令预取中止的指令 A(PC-8)处重新执行,所以返回指令为
SUBS PC, LR,#4(PC=A=LR-4)
白话解释:对于预取指令中止异常,发生预取指令异常时,是在执行时发生的异常,pc 未更新,即 pc = A+8;lr = pc – 4(这时处理器决定的,无法更改!)即 A+4 。
由于这类异常返回后应重新执行异常的那个指令(A),所以返回时,pc = lr-4

4,数据访问中止异常中断处理的返回:

指令地址
A PC-8 本指令访问有问题的数据,产生中断时,PC 的值已经更新

A+4 PC-4 中断发生时 PC=A+12,处理器将 A+8(PC-4)保存到 LR.
A+8 PC ;lr!

返回时,要返回到 A 处继续执行,所以指令为 SUBS PC, LR,#8.(PC=A=LR-8)
白话解释:对于数据访问中止异常,发生数据访问中止异常时,是在执行时访问数据错误导致的异常,pc 已经更新,即 pc = A+12
lr = pc – 4(这时处理器决定的,无法更改!)即 A+8 。
由于这类异常返回后应重新执行异常的那个指令(A),所以返回时,pc = lr-8

小节:
? 引起 PC 更新的原因一种是数据中止,还有就是中断了.
? 中断必须是在一条指令执行完毕后才能被检测到,所以它中断的只是还未执行的那条指令(pc - 8),所以 pc = lr – 4;
? 与中断相同,SWI 和未定义指令异常也是返回到下一条指令(pc - 4),只是他们在执行时,PC 的值并没有更新,所以 pc = lr;
? 预取指令中止异常,也没有发生 pc 更新,但它还得重新执行发生异常的那条指令,所以 pc = lr – 4;
? 数据访问中止异常,发生了 pc 更新,并且它也需要重新执行发生异常的那条指令,所以 pc = lr – 8。
更多资料QQ2825915309 TEL:18336308250

时间: 2024-08-10 20:19:52

ARM异常中断返回的几种情况的相关文章

ARM体系的异常中断

在ARM体系中,通常有3种方式控制处理器的流程  1:在正常执行过程中,每执行一条ARM指令,程序计数器寄存器PC的值加四个字节,在每执行一条Thumb指令,程序计数器寄存器PC的值加两个字节,整个过程是按照顺序执行的 2:通过跳转指令,程序可以跳转到指定的地址标号进行执行,或者跳转到特定的子程序进行执行,其中B指令用于执行跳转操作,BL指令用于执行跳转操作的同时,保存子程序相应的返回地址,BX在执行跳转操作的同时,分居目标地址的最低位,可以将程序切换到THumb状态,BLX执行上述三个操作 3

empty对如下8种情况返回true

1.strrchr函数 在W3School站点上的注释如下: strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符.如果成失败,否则返回 false. 实际上,这个函数是查找某个字符,而不是查找字符串,应该参考官方文档 代码示例:$a = 'abcdef.txt'; $b = '.php'; echo strrchr($a, $b);上面的代码输出是:.txt 也就是说,如果$b是字符串,只使用第一个字符,后面的其它字符会忽略 注?php提供

关于函数返回值的几种情况

1.     如果返回一个基本类型的变量,比如: int a; a = 5; return a; 那么就会a的一个拷贝,即5返回,然后a就被销毁了.尽管a被销毁了,但它的副本5还是成功地返回了,所以这样做没有问题. 2.     但是对于非动态分配(new/malloc)得到的指针,像1那么做就会有问题,比如在某个函数内部: int a[] = {1, 2}; return a; 那么也会返回指针a的一个拷贝,我们假定a的地址值为0x002345FC,那么这个0x2345FC是能够成功返回的.当

编写高质量代码改善C#程序的157个建议[用抛异常替代返回错误、不要在不恰当的场合下引发异常、重新引发异常时使用inner Exception]

原文:编写高质量代码改善C#程序的157个建议[用抛异常替代返回错误.不要在不恰当的场合下引发异常.重新引发异常时使用inner Exception] 前言 自从.NET出现后,关于CLR异常机制的讨论就几乎从未停止过.迄今为止,CLR异常机制让人关注最多的一点就是"效率"问题.其实,这里存在认识上的误区,因为正常控制流程下的代码运行并不会出现问题,只有引发异常时才会带来效率问题.基于这一点,很多开发者已经达成共识:不应将异常机制用于正常控制流中.达成的另一个共识是:CLR异常机制带来

TI C66x DSP 系统events及其应用 - 5.10(创建ISR的三种情况)

ISFP是服务中断的指令包,创建ISR的三种情况: 1,一个ISFP包的8条指令就可以满足ISR 2,ISR可以占用多个连续的ISFP(前提是下面的中断没有使用) 3,ISR位于IST之外 上述图中,B IRP表示从可屏蔽中断(INT4~15)中返回(从ISR返回或者从ISFP中返回)的指令.因为B指令有5个cycle的延迟,所以在B跳转指令后加上5个NOP指令,目的是防止CPU执行到其他的程序.如在第一张图中,如果B IRP后面的指令是单cycle指令(如NOP 1),那么CPU会在执行完IN

转:Tomcat内存溢出的三种情况及解决办法分析

Tomcat内存溢出的原因 在生产环境中tomcat内存设置不好很容易出现内存溢出.造成内存溢出是不一样的,当然处理方式也不一样. 这里根据平时遇到的情况和相关资料进行一个总结.常见的一般会有下面三种情况: 1.OutOfMemoryError: Java heap space 2.OutOfMemoryError: PermGen space 3.OutOfMemoryError: unable to create new native thread. Tomcat内存溢出解决方案 对于前两种

这七种情况下,不要创业

发表于:2009-03-19 12:43:02 楼主 创业是要非常理性的去对待的一件大事.并非人人都适合创业,对于个人而言有七种现象不适合你创业. 创业是失败过很多次,我时常在给自己找原因,失败的原因其实很关键,这么长时间一直在一个打工者的角度上来看这段经历,也看包括我在内的四个合伙人.每个人都扮演着不同的角色. 最后我得出的结论是:人在价值上绝对是分层的,从创业的角度来分析人其实是分成四类的:创业的,职业的,学习的,就业的.不一样的人可以选择不一样的道路,但是必须进行职业检测,小心小心再小心.

javascript 按位或(|),无符号右移(>>>)运算,组合技巧来实现————密码强度提示,四种情况??

直接上代码,原来的代码中,switch中的第一个case,判断之后,少加了个break 跳出判断语句,害得我查了半天,“怎么样式老是不对,不科学啊,呵呵,原来是没跳出case的判断了,还会执行后面的判断!!,哎,嘿嘿,不过后来还是发现了,开心中...” 原文地址:http://www.cnblogs.com/wybztn/archive/2009/11/18/1605285.html 这里还有个重要的设计技巧, 0001, 0010, 0100, 1000各代表一种情况的话,组合起来就有很多种情

布尔值为假的几种情况

判断变量或表达式的布尔值时,布尔值为假的七种情况: 空字符串 ‘ ’ .字符串 ‘0’ .整型 0 .浮点 0.0 .空数组Array().NULL.FALSE. 1 <?php 2 // 检验以下其中情况是否全部返回布尔值false. 3 if ( '' || '0' || 0 || 0.0 || array() || null || false ) { 4 echo "以上布尔值不全为false!"; 5 }else{ 6 echo "以上布尔值均返回false!&