浅析arm的异常、中断和arm工作模式的联系
说到异常向量,会让人联想到中断向量。其实,中断是属于异常的子集的,也就是说中断其实是异常其中的一种。
回到异常向量,他其实是一张表格,每个格子里存放的是一个地址,或者是一个跳转命令,不管是哪个,其目的都是让PC跳转到真正处理异常的代码的地方。
以下是arm的异常向量表:

图1
初步介绍完异常向量,就来对比下ARM的arm的7种工作模式:

图2
User : 非特权模式,大部分任务执行在这种模式
FIQ : 当一个高优先级(fast) 中断产生时将会进入这种模式
IRQ : 当一个低优先级(normal) 中断产生时将会进入这种模式
Supervisor :当复位或软中断指令执行时将会进入这种模式
Abort : 当存取异常时将会进入这种模式
Undef : 当执行未定义指令时会进入这种模式
System : 使用和User模式相同寄存器集的特权模式
可以发现arm的7种工作模式其实是和arm的异常向量表有着一定的对应关系的。
接着来看ARM的一个非常重要的寄存器——CPSR程序状态寄存器,如图二所示:该寄存器在arm的任何工作模式中都存在,且是被所以工作模式共用的。
寄存器每一位的含义如下图所示:

图3
以上3者有着莫大的关联,结合三者分析,就会明白很多东西。
其一、arm的7种工作模式,和异常向量表有着一定的对应关系。 如SVC模式下发生普通中断(IRQ)arm自动切换到IRQ模式,进入IRQ模式后PC就会指向IRQ对应异常向量表,及0x18这个位置。
再比如复位时,就会进入svc模式,并且跳到Reset对应的异常向量表,及0x00位置(这也是为什么程序是从0x00开始执行的)
其二、工作模式的切换有主动和被动之分。上面所说的就是被动切换,他是随着某种异常的发生而导致的切换。
主动切换,就要靠cpsr这个寄存器了。可以看到这个寄存器的末四位就是用来设定进入哪种模式的。
何时需要cpsr主动切换模式呢:
1、一开始就想进入某种模式。如:一开始设置所有模式下的sp地址。示例如下:

2、进入某种模式后,想切换到之前的模式。这个过程通常是通过读回SPSR的值。示例如下:

接着,我们来区分异常和中断的区别和联系:
1、中断可以看作是异常的一种情况。
2、中断是可以屏蔽的,如通过cpsr寄存器的I位和F位分别屏蔽IRQ和FIQ。而异常是无法屏蔽的。
3、异常/中断发生时,PC都会指向相应的向量表。异常的发生往往会导致模式的自动切换。
4、IRQ和其他模式稍有不同。因为被动切换到IRQ模式下的情况有很多种,换句话就是,很多种中断,都会导致进入IRQ模式。进入IRQ模式还需要判断是那种情况导致了中断,所以IRQ往往还对应一张中断向量表。(区分于异常向量表)相当于异常向量表的子级表。
最后看,在模式切换时,都发生了什么?
1、当模式发生切换时(主动或者被动),硬件会自动帮我们完成一些事情。然后还需要软件完成一些事情。
做好这两件事,就可以在模式之间切换而不会相互影响,当然对应程序员而言只需要做好后者。
2、硬件帮我们完成的事情,是在模式切换时随之完成,而软件要完成的任务,是在模式切换之后。这点需要十分注意!比如当前是SVC模式切换到IRQ模式。那么软件需要完成的事情,是在当前IRQ模式下完成的。
3、那么硬件完成了什么事情,软件又需要做什么呢?
3.1、硬件完成的事情有:

切换到新的模式后,用的就是当前模式下的sp以及lr,但是pc只有一个。由于硬件帮我们
完成的一些事。所以当前IRQ模式下的lr寄存器存放的其实是上个模式SVC的PC值。当前IRQ模式下的
SPSR寄存器存放的其实是上个模式SVC的CPSR值。这充分为返回上一个模式做好了准备。
3.2、所以软件需要完成的任务有:
3.2.1、保存当前共用寄存器的值,(如SVC模式和IRQ模式共用r0~r12 以及r15及pc)到当前模式的栈内存。保证之前模式的值不被破坏。
这里CPSR虽然也是共用的,但是不用保存到栈中,这是因为硬件会自动把上个模式的CPSR保存到当前模式的SPSR。
而SPSR直到中断返回,及切换到之前的模式才会用到。有点同学会问了,pc的值也会由硬件自动保存到lr,为什么还需要保存到栈中呢?这是因为lr和SPSR不同,在中断执行的过程中,很可能需要使用lr,为了不把之前的pc值冲掉还是先将其发到栈中保存。
3.2.2、进入中断处理函数。处理中断。
3.2.3、中断返回,将之前保存到栈里的值读回,并SPSR的值赋值给CPSR实现主动切换到之前的模式。示例代码:

最后,聊一个面试经常问的问题,FIQ相比IRQ,FIQ称为快速中断,IRQ称为普通中断。FIQ为什么比IRQ快!
我们可以结合图1和图2进行分析:
1、先看图1,FIQ的异常向量地址为0x1C,位置处于最顶部,这就意味着,FIQ真正的异常处理代码可以紧接着0x1C,及无需跳转,不跳转意味着无需打断arm的流水线,所以可以提高中断响应。
2、再看图2,FIQ模式下具有更多的独立寄存器,如r8~r14,这些寄存器都是FIQ模式下独自享用的。这就意味着,当发生快速中断,进行模式切换时,只有少量的寄存器需要备份到栈中,从而也能节省时间,提高中断的响应速度。
以上两点就是FIQ为什么比IRQ快的原因,别小看节省的这么一点点时间,有的时候就是这么“兵贵神速”。
浅析arm的异常、中断和arm工作模式的联系的更多相关文章
- ARM体系的7种工作模式
一.ARM体系的CPU有以下7种工作模式: 用户模式(usr) 大多数程序运行于用户模式 特权模式 系统模式(sys) 运行具有特权的操作系统任务 异常模式 中断模式(irq) ...
- 嵌入式中 ARM的几种工作模式 以及异常模式的优先级
一.Arm工作模式: Arm微处理器支持7种工作模式,分别为: 1. 用户模式(Usr) 用于正常执行程序 2. 快速中断模式(FIQ) 用于高速数据传输 3. 外部中断模 ...
- ARM体系的异常中断
在ARM体系中,通常有3种方式控制处理器的流程 1:在正常执行过程中,每执行一条ARM指令,程序计数器寄存器PC的值加四个字节,在每执行一条Thumb指令,程序计数器寄存器PC的值加两个字节,整个过 ...
- 2—ARM中的异常中断
ARM体系中的3种控制程序执行的方式 正常执行过程中,每执行1条ARM指令,PC的值加4个字节:每执行1条Thumb指令,PC的值加2个字节.整个过程按照顺序执行. 通过跳转指令,调到特定的地址开始执 ...
- ARM异常中断返回的几种情况
在学习韦老师视频中中断异常部分时候,对于发生中断时需要执行的#保存异现场 #恢复现场 中的“返回”弄不清楚,查阅网络文章后,发现一篇概述我觉得我能理解的一篇如下: 重要基础知识:R15(PC)总是 ...
- ARM工作模式
ARM工作模式 学习ARM的最好的资料是ARM公司发布的资料:ARM Architecture Reference Manual.pdf 找到章节:Programmers’ Model 由文档可知:A ...
- ARM的工作模式和寄存器
以前学的时候学的是S3C6410的开发板,它是三星公司推出的基于ARM v6架构(指令集),处理器是ARM11. ARM架构是构建每个ARM处理器的基础. 目前最新的是ARM v8架构:http:// ...
- ARM处理器工作模式
学习ARM处理器参考的首选资料是ARM Architecture Reference Manual,是最专业权威的学习资料. ARM处理器共有7种工作模式,如表1-1和1-2所示: 表1-1 处理器工 ...
- [国嵌笔记][021-022][ARM处理器工作模式]
[ARM处理器工作模式] 处理器工作模式 1.User(urs):用户模式,linux应用程序运行在用户模式 2.FIQ(fiq):快速中断模式 3.IRQ(irq):中断模式 4.Superviso ...
随机推荐
- Android--PullToRefreshListView的onRefreshComplete()不起作用的问题
今天用到了网上开源的下拉刷新组件PullToRefreshListView的第三方下拉刷新的ListView 我们发现 有时候我们当使用它的onRefreshComplete()方法是,我们下拉出来的 ...
- 【转】CentOS 6.6 升级GCC G++ (当前最新版本为v6.1.0) (完整)
原文地址:https://www.cnblogs.com/lzpong/p/5755678.html 我这里是centos7 升级到gcc8.1,过程差不多,参考这篇文章,记录一下. ---原文--- ...
- tomcat报错this web application instance has been stopped already问题
上网搜了下,大部分的报错原因:重启时候 之前的tomcat未正常关闭 ,导致在重启时候 报了这个问题.mac下解决: ps -ef|grep tomcat 找到在进行的tomcat ,kill -9 ...
- jsp 发布war 包到Tomcat
1.将项目打包成war,打包过程这里不做赘述 2.在linux或者windows下安装xmapp 3.打开Tomcat下conf/server.xml,在host下添加一行 <Co ...
- Google Play内购测试
Google Play内购测试 最近项目做海外版本,接入Google wallet支付后,测试验证比较繁琐,故记录一下. Google wallet支付方式接入完成后,需要按照如下步骤设置,才可以进行 ...
- Oracle EBS OPM reshedule batch
--reschedule_batch --created by jenrry DECLARE x_message_count NUMBER; x_message_list VARCHAR2 (2000 ...
- python自学——文件修改
#如何修改文件,我们知道文件因为在磁盘上已经有储存了,后面要更新或修改,只能在在原来文件后面追加使用f=open("wenjian_name","r+",enc ...
- net.exe use命令的使用
net.exe use 查看当前的连接 net.exe use * /del /y 断开所有连接 net.exe use \\server\share "password" /us ...
- Sql Server2008R2下载地址
ed2k://%7Cfile%7Ccn_sql_server_2008_r2_enterprise_x86_x64_ia64_dvd_522233.iso%7C4662884352%7C1DB0252 ...
- Django商城项目笔记No.15用户部分-用户中心邮箱验证
首先增加前端页面success_verify_email.html页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona ...