ARM中断返回地址详细分析

ARM中断返回地址详细分析


在ARM体系中,通常有以下3种方式控制程序的执行流程:
1、在正常执行过程中,每执行一条ARM指令,程序计数器PC的值加4个字节;每执行一条Thumb指令,程序计数器PC加2个字节。整个过程是顺序执行的;
2、跳转 B指令执行跳转操作;BL指令在执行跳转的同时,保存子程序返回地址;BX指令,执行跳转的同时,根据目标地址的最低位,可以将程序状态切换到Thumb状态;BLX指令执行上述3个操作;
3、当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。在进入异常中断处理程序时,要保存被中断的程序的执行现场,在从异常中断处理程序退出时,要恢复被中断的程序的执行现场。当异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行。


重点:ARM处理器对异常中断的响应过程:
㈠、保存当前程序状态寄存器CPSR到对应异常中断的处理器模式下的SPSR中;
㈡、设置当前程序状态寄存器CPSR的处理器模式位M(4:0)为对应的处理器模式,并禁止IRQ中断(设置I位=1);当进入的是FIQ模式时,禁止FIQ中断(设置F位=1);
㈢、将对应异常中断的处理器模式下的LR设置成返回地址;
㈣、将程序计数器PC值,设置成该异常中断向量地址,从而跳转到相应的异常中断处理程序处执行。
上述处理器对异常中断的响应过程可以用伪代码描述如下:
R14<exception_mode>=return Link
SPSR<exception_mode>=CPSR
CPSR[4:0]=exception mde number
CPSR[5] = 0        //所有异常均在ARM状态下处理
if(<exception_mode>==Reset or FIQ )then
CPSR[6]=1 //禁止FIQ中断
CPSR[7] =1 //禁止IRQ中断
PC = exception vetor address
程序将自动跳转到对应异常中断的处理程序中。
上述过程,完全由处理器自动完成,所以,当发生一种异常中断时,寄存器R14 、CPSR、SPSR和PC的值将是上述的结果!
ARM处理器中主要有7个异常(2个中断异常):
1、复位异常;在以ARM为核的单片机中,常把下列事件作为引起复位的原因。
(1)上电复位:在上电后,复位使内部达到预定的状态,特别是程序跳到初始入口;
(2)复位引脚上的复位脉冲:这是由外部其他控制信号引起的;
(3)对系统电源检测发现过压或欠压;
(4)时钟异常复位。
ARM处理器复位后,处理器硬件将进行以下操作:
(1)强制进入管理模式;0b10011
(2)强制进入ARM状态;T=0
(3)跳转到绝对地址PC=0x00000000处执行;
(4)禁止IRQ中断和FIQ中断。I=1,F=1;
复位后,程序状态寄存器如下:       
...... I  F  T  M4  M3  M2  M1  M0
1  1  0   1    0    0    1   1
上电复位后,进入管理模式,执行操作系统程序,一般用做对系统初始化,例如开中断等;然后切换到用户模式,开始执行正常的用户程序。
切换到用户模式可使用下列程序:
MRS R0,CPSR     ;读状态寄存器
BIC R0,R0,#03   ;把末两位清0
MSR CPRS_c,R0   ;把修改后的值加载给状态寄存器,切换结束
......          ;用户程序
2、未定义指令异常;由于ARM使用32位代码,包含的信息量很大,可达2的31方(4G)。ARM指令集不能用尽所有代码。当ARM处理器遇到无法译码的指令时就会发生未定义指令异常。进入中断处理程序。
ARM的未定义指令异常有以下两种情况:
(1)遇到一条无法执行的指令,此指令没有定义;
(2)执行一条对协处理器的操作指令,在正常情况下,协处理器应该应答,但协处理器没有应答。
未定义异常中断时,处理器硬件将进行以下操作:
(1)把下一条指令的地址拷贝给LR;
(2)把程序状态寄存器CPSR拷贝给SPSR_und;
(3)强制进入未定义模式; 0b11011
(4)强制进入到ARM模式;T=0
(5)跳转到绝对地址PC=0x00000004处执行;
(6)禁止IRQ中断。 I=0
(7)状态寄存器中的F位不变。
进入中断后,程序状态寄存器如下:
...... I  F  T  M4  M3  M2  M1  M0
1  x  0   1    1    0   1    1
使用下列指令退出异常中断,返回原程序 。
MOVS PC,R14.
3、软件中断异常;是由指令SWI引起的。程序在执行这一指令后,进入异常中断。
SWI和未定义指令异常中断是由当前执行的指令自身产生的。当SWI和未定义指令异常中断产生时,程序计数器PC的值还未更新,它指向当前指令后面第2条指令(对于ARM指令来说+8字节;对于Thumb指令来说+4字节的位置)。当SWI和未定义指令异常中断产生时,处理器将值(PC-4)保存到异常模式下的寄存器LR_mode中。这时(PC-4)即指向当前指令的下一条指令地址。因此返回操作可以通过下面的指令来实现:MOV PC,LR。该指令将寄存器LR中的值复制到程序计数器PC中实现程序返回,同时将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。
处理器响应中断,硬件执行如下的操作。
(1)把下一条指令的地址拷贝给LR;
(2)把程序状态寄存器CPSR拷贝给SPSR_svc;
(3)强制进入管理模式;0b10011
(4)强制进入到ARM状态;T=0
(5)跳转到绝对地址PC=0x00000008处执行;
(6)禁止IRQ中断。 I=1; F保持不变;
进入中断后的程序状态寄存器如下:
...... I  F  T  M4  M3  M2  M1  M0
1  x  0   1    0    0   1    1
软件中断处理程序完成后,使用下列指令返回到原中断处:MOVS PC,R14.
4、预取指中止异常;由程序存储器引起的中止异常叫做预取指中止异常;由数据存储器引起的中止异常叫做数据中止异常。由于ARM的指令是3级流水线结构,读取指令周期是提前进行的,因此把读取指令的过程一般称预取指。如果在取得指令的同时程序存储器发出中止信号,则ARM处理器把这一条指令标记位无效,然后等待执行。
在指令预取时,如果目标地址是非法的,该指令将被标记成有问题的指令。这时,流水线上该指令之前的指令继续执行。当执行到该被标记成有问题的指令时,处理器产生指令预取中止异常中断。
当发生指令预取中止异常中断时,程序要返回到该有问题的指令处,重新读取并执行该指令。因此指令预取中止异常中断程序应该返回到产生该指令预取中止异常中断的指令处,而不是像前面两种情况下返回到发生中断的指令的下一条指令。
指令预取中止异常中断是由当前执行的指令自身产生的,当指令预取中止异常中断产生时,程序计数器PC的值还未更新,它指向当前指令后面第2条指令(对于ARM指令来说,它指向当前指令地址加8个字节的w位置;对于Thumb指令来说,它指向当前指令地址加4个字节的位置)。当指令预取中止异常中断产生时,处理器将(PC-4)值保存到异常模式下的寄存器LR_mode中。这时(PC-4)即指向当前指令的下一条指令。因此返回操作可以通过下面的指令来实现:SUBS PC,LR,#4
该指令将寄存器LR中的值减4后,复制到程序计数器PC中,实现程序返回,同时将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。
有两种可能如下:
(1)当执行这条指令前程序发生跳转,则这条无效指令不引起异常中断;
(2)当执行到这条指令时,处理器会发生预取指中止异常,引起中断。
当进入预取指异常中断时,处理器硬件响应中断,执行以下的操作:
(1)把中断时PC的地址拷贝给LR;
(2)把程序状态寄存器CPSR拷贝给SPSR_abt;
(3)强制进入中止异常模式;0b10111
(4)强制进入到ARM状态;T=0;
(5)跳转到绝对地址PC=0x0000000C处执行;
(6)禁止IRQ中断。    I=1;
进入中断后,程序状态寄存器如下:
...... I  F  T  M4  M3  M2  M1  M0
1  x  0   1    0    1    1    1
预取指中止异常中断返回时,应该执行下列指令:SUBS PC,R14,#4.
5、数据中止异常;ARM处理器访问数据存储器时,在读取数据的同时数据存储器发出了中止信号,引起数据中止异常。
当进入预取数据异常中断时,处理器硬件响应中断,执行以下的操作:
(1)把中断时的PC的地址拷贝给LR;
(2)把程序状态寄存器CPSR拷贝给SPSR_abt;
(3)强制进入中止异常模式;
(4)强制进入到ARM状态;
(5)跳转到绝对地址PC=0x00000010处执行;
(6)禁止IRQ中断。
进入中断后,程序状态寄存器如下:
...... I F T M4 M3 M2 M1 M0  
1 x 0 1   0    1   1   1
数据中止异常中断服务程序返回时,使用下列指令:SUBS PC,R14,#8
上述指令是返回到中断时所执行的指令,目的是再一次从数据存储器中读取数据。如果不再一次读取数据,则执行下一条指令,此时使用下列指令返回:     
SUBS PC,R14,#4
6、中断请求(IRQ)异常;例如:定时器中断、串行口通讯中断、外部信号中断和A/D处理中断等。IRQ中断是可屏蔽的。
通常当处理器执行完当前指令后,查询IRQ中断引脚及FIQ中断引脚,并且查看系统是否允许IRQ及FIQ中断。如果有中断引脚有效,并且系统允许该中断产生,处理器将产生IRQ或FIQ异常中断。这时,程序计数器PC的值已经更新,它指向当前指令后面的第3条指令(对于ARM指令来说,它指向当前指令地址+12字节位置;对于Thumb指令来说,它指向当前指令地址+6字节的位置)。处理器这时将值(PC-4)保存到异常模式下的寄存器LR_mode中。这时(PC-4)即指向当前指令后面的第2条指令。因此返回操作可以通过下面的指令实现: SUBS PC, LR, #4
该指令将寄存器LR中的值减4后,复制到程序计数器PC中,实现程序返回,同时将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。
在状态寄存器中的I位就是IRQ的屏蔽位。当I=1时。则屏蔽IRQ中断,当I=0时,则允许中断。处理器复位后置I为1,关闭中断。
当发生IRQ中断时,处理器硬件响应中断,执行下列操作:
(1)把中断时的PC的地址值拷贝给LR;
(2)把程序状态寄存器CPSR拷贝给SPSR_irq;
(3)制进入IRQ异常模式;
(4)强制进入到ARM状态;
(5)跳转到绝对地址PC=0x00000018处执行;
(6)禁止IRQ中断。
进入中断后,程序状态寄存器如下:
...... I F T M4 M3 M2 M1 M0
1 x 0  1  0  0  1   0
完成中断处理后,程序执行下列返回原中断处:SUBS PC.R14,#4.
7、快速中断(FIQ)请求异常;FIQ快速中断是可屏蔽的。在状态寄存器中的F位就是FIQ的屏蔽位。当F=1时。则屏蔽FIQ中断,当F=0时,则允许中断。处理器复位后置F为1,关闭中断。  
当发生FIQ中断时,处理器硬件响应中断,执行下列操作:
(1)把中断时的PC的地址值拷贝给LR;
(2)程序状态寄存器CPSR拷贝给SPSR_fiq;
(3)强制进入FIQ异常模式;
(4)强制进入到ARM状态;
(5)跳转到绝对地址PC=0x0000001C处执行;
(6)禁止FIQ中断。
进入中断后,程序状态寄存器如下:
...... I F T M4 M3 M2 M1 M0
1 x 0  1  0  0  0   1
完成中断处理后,程序执行下列返回原中断处:SUBS PC.R14,#4




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

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

相关文章

C++识别二维码

C识别二维码 https://blog.csdn.net/coolingcoding/article/details/25804129 https://blog.csdn.net/sw5131899/article/details/52848957 https://blog.csdn.net/weichaohnu/article/details/8275829

Linux-C 编程 / 网络 / 超迷你的 web server

一、为生活寻找固定的支撑点1. 什么是生活的支撑点&#xff1f;让自己感到些许痛苦&#xff0c;但却会带来实实在在的充实感和成就感的事情。举个栗子&#xff0c;我的支点是运动、看书、研究技术。2. 固定的支撑点很重要&#xff1a;三个固定的要素&#xff1a;时间 / 空间 / …

20165326 java第四周学习笔记

第四周学习笔记 ch5 子类和父类子类只能有一个父类使用关键字extendsyclass 子类 extends 父类系统默认的祖先类Object&#xff08;java.lang包中&#xff09;继承&#xff1a;子类继承父类的方法可以直接作为实例方法调用&#xff0c;继承的成员变量和方法的访问权限不变&…

用VSTS进行网站压力测试

VSTS提供了一个丰富、强大的工具平台&#xff0c;融合了软件开发领域的各个角色&#xff0c;涵盖软件开发生命周期的各个阶段&#xff0c;包括设计&#xff0c;开发&#xff0c;测试&#xff0c;管理&#xff0c;而这一整套构件的融会贯通&#xff0c;让它可以有效地改善软件开…

基于 DirectShow 的播放器

https://blog.csdn.net/leixiaohua1020/article/details/13019147 COM编程之 QueryInterface https://www.cnblogs.com/Braveliu/p/3435560.html

第四周选做作业

相关知识点的总结 通过命令行引入参数递归循环课上内容的补做&#xff0c;结果截图 未完成内容:递归与循环 补做教材第二章&#xff0c;第三章编程题目 参考资料 2016-2017-2 《Java 程序设计》课堂实践项目编写一个Java应用程序,输出全部的希腊字母。_百度知道[]转载于:https:…

数据结构和算法,也就那么回事儿

金三银四来了&#xff0c;各大厂动静不小&#xff0c;都在储备人才&#xff0c;绝对是程序员面试的黄金时间了&#xff0c;不少同学也在后台反馈面试中遇到的一些问题&#xff0c;所以今天想跟大家说说算法。说起算法&#xff0c;那大厂面试是绝对必考的&#xff0c;可以说是一…

批处理详细教程(五)

六.精彩实例放送。1.删除win2k/xp系统默认共享的批处理------------------------ cut here then save as .bat or .cmd file ---------------------------echo preparing to delete all the default shares.when ready pres any key.pauseecho off:Rem check parameters if nul…

SecureCRT护眼设置

SecureCRT护眼设置Option —— Global Options —— Terminal —— Appearance —— ANSI COlor从左至右&#xff0c;从上至下值分别为&#xff08;RGB元组&#xff09;&#xff1a; 1&#xff1a;(0,43,53) (128,128,0) (0,160,0) (160,160,0) (255,128,128) (…

北美暴风雨,Linux5.12被延迟6天发布

上个月中旬&#xff0c;因为罕见的严寒天气和暴风雪&#xff0c;美国得州和俄勒冈州波特兰遭遇了持续多天的停电。Linux 创始人 Linus Torvalds 就生活在波特兰&#xff0c;多年来他一直在家中远程工作&#xff0c;并负责新内核的最终发布。之前我们报道过&#xff0c;内核社区…

C#复习笔记(3)--C#2:解决C#1的问题(可空值类型)

可空值类型 C#2推出可空类型来表示可以为null的值类型。这是一个呼声很高的需求&#xff0c;因为在常用的数据库中都是允许某些值类型可为空的。那么为什么值类型就不能为空呢&#xff1f;内存中用一个全0的值来表示null&#xff0c;但是全0的地址说明了这个内存空间是被清除了…

extern “C”的作用详解

extern “C”的作用详解 extern "C"的主要作用就是为了能够正确实现C代码调用其他C语言代码。加上extern "C"后&#xff0c;会指示编译器这部分代码按C语言的进行编译&#xff0c;而不是C的。由于C支持函数重载&#xff0c;因此编译器编译函数的过程中会将…

ISA之三种客户端访问

我们已经懂得怎么搭建ISA2006.我们今天来利用ISA访问外网&#xff01;顺便说声如果你IP&#xff0c;网关&#xff0c;DNS什么都没问题。那么你可以看看你的NAT处理&#xff01;下面我们看看我们的试验拓扑&#xff01;我们在ISA的服务器上做访问规则&#xff01;来允许我们可以…

ARM的位置无关程序设计

ARM的位置无关程序设计 ARM处理器支持位置无关的程序设计&#xff0c;这种程序加载到存储器的任意地址空间都可以正常运行&#xff0c;其设计方法在嵌入式应用系统开发中具有重要的作用。尤其在裸机状态下开发Bootloader程序及进行内核初始化设计&#xff1b;利用位置无关的程序…

面试官不讲武德,居然让我讲讲蠕虫和金丝雀!

1. 蠕虫病毒简介2. 缓冲区溢出3. 缓冲区溢出举例4. 缓冲区溢出的危害5. 内存在计算机中的排布方式6. 计算机中越界访问的后果7. 避免缓冲区溢出的三种方法7.1 栈随机化7.2 检测栈是否被破坏7.3 限制可执行代码区域8. 总结蠕虫病毒是一种常见的利用Unix系统中的缺点来进行攻击的…

asp.net core 拦击器制作的权限管理系统DEMO

效果图 没有登陆不会执行请求日期的方法&#xff0c;不管是否登陆都不允许访问请求时间方法 验证不通过是会进行转发到Home/error方法中&#xff0c; 代码附上&#xff1a; [Route("[controller]/[action]")]public class HomeController : BaseController{/// <s…

WritePrivateProfileString等读写.ini配置文件

https://blog.csdn.net/wuguai4/article/details/7287346

工程师姓什么很重要!别再叫我“X工”!!!

工程师之间都是这么互相打招呼的——“高工&#xff0c;你设计图通过了么&#xff1f;”“李工&#xff0c;工程画完了吗&#xff1f;”“王工&#xff0c;你真是越来越漂亮了&#xff01;”"张工&#xff0c;你的DFM整完了吗"“周公&#xff0c;Schedule 该更新了”…

Eclipse快捷键大全(转载)

Ctrl1 快速修复(最经典的快捷键,就不用多说了)CtrlD: 删除当前行 CtrlAlt↓ 复制当前行到下一行(复制增加)CtrlAlt↑ 复制当前行到上一行(复制增加)Alt↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)Alt↑ 当前行和上面一行交互位置(同上)Alt← 前一个编辑的页…

STM32F103按键操作的另一种实现——状态机

#ifndef _KEY_H_ #define _KEY_H_#include "HAL_gpio.h" // 换成STM32F103对应的GPIO库 #include "type.h" // type.h主要是一些类型的重命名#define KEY_UP_GRP GPIOA #define KEY_UP_IDX GPIO_Pin_9 #define KEY_UP_IS_DOWN() GPI…