arm中断体系结构
ARM处理器中有7种类型的异常,按优先级从高到低的排列如下:
复位异常(Reset)、
数据异常(Data Abort)、
快速中断异常(FIQ)、
外部中断异常(IRQ)、
预取异常(Prefetch Abort)、
软件中断(SWI)、
未定义指令异常(Undefined instruction)。

ARM异常优先级:

(1)当发生各种异常时,CPU会进入对应的工作模式,并跳转到它的异常向量处进行执行程序,那么这一步骤我们可以在汇编文件中进行配置:
异常向量:在0x00,0x04...处的指令称为异常向量
.text .global _start _start: @0x00复位异常
b reset @0x04未定义指令终止异常
undefined_interrupt: b undefined_interrupt @0x08软中断异常
software_abort: b software_abort @0x0c预取异常
prefetch_abort: b prefetch_abort @0x10数据异常
data_abort: b data_abort @0x14保留
notused: b notused @0x18外部中断
handle_iqr: b handle_iqr @0x1c快速中断
handle_fqr: b handle_fqr
(2)当上电或复位时,CPU进入svr模式,进入复位异常并跳转到地址0x00处进行执行程序:
当复位异常时,系统执行下列伪操作:
R14_svc = UNPREDICTABLE value //任意值
SPSR_svc = UNPREDICTABLE value //任意值
CPSR[4∶0] = 0b10011 /*进入管理模式*/
CPSR[5] = 0 /*处理器进入ARM状态*/
CPSR[6] = 1 /*禁止快速中断*/
CPSR[7] = 1 /*禁止外设中断*/
If high vectors configured then
PC = 0xffff0000
Else
PC = 0x00000000
复位异常中断处理程序的主要功能:
*设置异常中断向量表。
*初始化数据栈和寄存器。
*初始化存储系统,如系统中的MMU等。
*初始化关键的I/O设备。
*使能中断。
*处理器切换到合适的模式。
*初始化C变量,跳转到应用程序执行。
reset: ldr sp,= //设置栈 bl disable_watch_dog //关闭看门狗 msr cpsr_c, #0xd2 //
ldr sp, = //(在复位异常中提前设置中断模式的栈指针,防止中断触发时栈指针未设置而系统崩溃)
msr cpsr_c, #0xd3 //0xd3--11010011b
ldr sp, = //进入管理模式,设置栈指针 bl init_led //初始化led的gpio管脚
bl init_irq //初始化中断 msr cpsr_c, #0x53 //使能IRQ中断0x53--01010011 ldr lr, =halt_loop //设置返回地址 ldr pc, =main //调用main函数 halt_loop: b halt_loop
关于当前程序状态寄存器CPSR及msr,mrs汇编指令的知识:
1)CPSR寄存器
ARM每种工作模式除R0~R15共16个寄存器外,还有第17个寄存器CPSR,CPSR中一些位被用于标识各种状态,一些位被用于标识当前出于什么工作模式

如上图所示,它的CPU状态位=> T位=0 --ARM状态
=1 --Thumb状态
它的中断禁止或使能位=> I和F位=0 --使能
=1 --禁止
它的M[4:0]位=> xxxxx,通过编写它可以使得CPU进入相应的工作模式

它的条件码标志位:N、Z、C、V--它们的内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行。

2) msr及mrs汇编指令
格式:MRS{<条件码>}Rd,CPSR}SPSR
其中:
Rd 目标寄存器,Rd不允许R15。
R=0 将CPSR中的内容传送目的寄存器。
R=1 将SPSR中的内容传送至目的寄存器。
功能:将状态寄存器的内容传送至通用寄存器。
2 格式:MSR{<条件码>CPSR_<field>|SPSR_<field>,Rm
其中:
<field>字段可以是以下之一或多种:(位从右到左)
C:控制域屏蔽字段(PSR中的第0位到第7位);
X:扩展域屏蔽字段(PSR中的第8位到第15位);
S:状态域屏蔽字段(PSR中的第16位到第32位);
F:标志域屏蔽字段(PSR中的第24位到第31位)。
Rm 源寄存器。
功能:将通用寄存器的内容传送至状态寄存器。
(3)当触发中断时,CPU进入中断模式,并跳转到中断异常向量处进行执行:
1.计算返回地址
2.现场保存工作
3.执行中断服务函数
4.清理现场,中断返回
handle_iqr: sub lr,lr, # //lr=lr-4 计算返回地址
stmdb sp!, {r0-r12,lr} ldr lr, =int_return
ldr pc, =EINT_Handleiqr int_return: ldmia sp!, {r0-r12,pc}^
arm中断体系结构的更多相关文章
- JZ2440 裸机驱动 第9章 中断体系结构
本章目标: 了解ARM体系CPU的7种工作模式 了解S3C2410/S3C2440中断体系结构 掌握S3C2410/S3C2440的中断服务程序的编写方法 9.1 S3C241 ...
- Linux中断体系结构
1.中断处理体系结构 Linux内核将所有中断统一编号,使用一个irq_desc结构数组来描述这些中断. 数组声明在/linux/kernel/irq/handle.c中,其中#define NR_I ...
- 可能是讲解ARM中断和中断嵌套最通俗易懂的文章
几天前一个学生问我ARM中断嵌套的问题,我才发现原来在我心中理所当然的事对学生来说理解实属不易. ARM有七种模式,我们这里只讨论SVC.IRQ和FIQ模式. 我们可以假设ARM核心有两根中断引脚 ...
- linux-2.6.26内核中ARM中断实现详解(转)
转载:http://www.cnblogs.com/leaven/archive/2010/08/06/1794293.html 更多文档参见:http://pan.baidu.com/s/1dDvJ ...
- ARM 中断状态和SVC状态的堆栈切换 (异常)【转】
转自:http://blog.csdn.net/edwardlulinux/article/details/9261393 版权声明:本文为博主原创文章,未经博主允许不得转载. ARM 中断状态和SV ...
- ARM中断深入分析几点
ARM中断深入分析几点 1.程序发生中断后,是如何跳转到中断程序里面的? 2.执行完中断后,如何返回到原来被打断的地方接着执行呢? 3.ARM处理器的流水线结构对中断返回地址的计算有什么影响? 4.A ...
- ARM的体系结构与编程系列博客——ARM体系版本
ARM体系版本前言 很多人都知道,ARM有许多版本,口中最长说的就是ARM7\ARM9\ARM11,诚然,这个的确是ARM处理器的版本,但绝对不是ARM的版本,其实ARM到迄今为止经历了6代版本,随着 ...
- ARM的体系结构与编程系列博客——ARM处理器系列介绍
ARM处理器系列介绍 现在到了3月,过年过得过于舒服了.系列博客也停更了近半月,我果然是个慢(lan)性(gui)子,那么趁着到校的第一天晚上,就写一篇博客来继续我的系列博客了!众所周知,ARM处理器 ...
- ARM的体系结构与编程系列博客——ARM的历史与应用范围
前言 最近我感觉自己比较浮躁,重来没有好好地沉下心来做一件事情,而且针对自己在专业水平上仍然还有很多欠缺,于是我想我应该为自己做些什么来证明一下自己真的是潜心研究东西的人,于是我萌生了一个想法,真正地 ...
随机推荐
- 【2017-02-28】C# 冒泡排序
冒泡排序 重复地走访过要排序的数列,一次比较两个元素的大小,如果他们的顺序错误就把他们交换过来 通过两个For循环嵌套来实现 思路——以从小到大为例 第一个for循环抽取第一个数和第二个数进行比较,如 ...
- tomcat2章1
package ex02.pyrmont; import java.io.File; public class Constants { public static final String WEB_R ...
- Qt读取TXT文件时,GBK与UTF-8编码判断
读取txt文件时,很多时候无法获取文件的编码格式.如果直接进行使用,则有可能出现乱码.需要在使用前将其转为Unicode(Qt的默认编码格式). 虽然实际的编码格式种类非常多,但平常主要使用的有GBK ...
- Codeforces 579A. Raising Bacteria
You are a lover of bacteria. You want to raise some bacteria in a box. Initially, the box is empty. ...
- echo 命令详解
echo命令用于在shell中打印shell变量的值,或者直接输出指定的字符串. 选项 -e:激活转义字符. 使用-e选项时,若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出: \a ...
- Android4.0 主线程不能访问网络异常解决办法
从两个方面说下这个问题: 1. 不让访问网络的原因 2. 解决该问题的办法 不让访问网络的原因: 由于对于网络状况的不可预见性,很有可能在网络访问的时候造成阻塞,那么这样一来我们的主线程UI线程 就会 ...
- [转载]dbms_lob用法小结
http://blog.sina.com.cn/s/blog_713978a50100prkt.html CLOB里存的是2进制 判定长度 DBMS_LOB.GETLENGTH(col1)获取文本 ...
- 安装DotNetCore.1.0.0-VS2015Tools.Preview2一直失败,如何解?
首先要说明的一点是,本地的VS2015的环境已经安装完成,而且vs2015.3也已经更新完成了,这个环境应该是没啥问题.但是安装.DotNetCore.1.0.0-VS2015Tools.Previe ...
- win10 校园宽带连接不上的解决办法(错误720、“以太网”没有有效的ip设置)
遇到的问题如下图所示: 插上宽带后,查看以太网状态显示如下: 创建新连接宽带(PPPoE)(R)后,连接失败,错误为720,显示如下: 以太网网络诊断后,结果显示“以太网”没有有效的Ip设置,如下图所 ...
- JDK源码之ThreadLocal
1.定义 ThreadLocal是线程变量,就是说每一个线程都有对应的该变量副本,线程修改该变量时,线程与线程之间的变量是相互隔离的,互相并看不见.这个结构附带在线程上,一个线程可以根据ThreadL ...