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中断体系结构的更多相关文章

  1. JZ2440 裸机驱动 第9章 中断体系结构

    本章目标:     了解ARM体系CPU的7种工作模式     了解S3C2410/S3C2440中断体系结构     掌握S3C2410/S3C2440的中断服务程序的编写方法 9.1 S3C241 ...

  2. Linux中断体系结构

    1.中断处理体系结构 Linux内核将所有中断统一编号,使用一个irq_desc结构数组来描述这些中断. 数组声明在/linux/kernel/irq/handle.c中,其中#define NR_I ...

  3. 可能是讲解ARM中断和中断嵌套最通俗易懂的文章

    几天前一个学生问我ARM中断嵌套的问题,我才发现原来在我心中理所当然的事对学生来说理解实属不易.  ARM有七种模式,我们这里只讨论SVC.IRQ和FIQ模式.  我们可以假设ARM核心有两根中断引脚 ...

  4. linux-2.6.26内核中ARM中断实现详解(转)

    转载:http://www.cnblogs.com/leaven/archive/2010/08/06/1794293.html 更多文档参见:http://pan.baidu.com/s/1dDvJ ...

  5. ARM 中断状态和SVC状态的堆栈切换 (异常)【转】

    转自:http://blog.csdn.net/edwardlulinux/article/details/9261393 版权声明:本文为博主原创文章,未经博主允许不得转载. ARM 中断状态和SV ...

  6. ARM中断深入分析几点

    ARM中断深入分析几点 1.程序发生中断后,是如何跳转到中断程序里面的? 2.执行完中断后,如何返回到原来被打断的地方接着执行呢? 3.ARM处理器的流水线结构对中断返回地址的计算有什么影响? 4.A ...

  7. ARM的体系结构与编程系列博客——ARM体系版本

    ARM体系版本前言 很多人都知道,ARM有许多版本,口中最长说的就是ARM7\ARM9\ARM11,诚然,这个的确是ARM处理器的版本,但绝对不是ARM的版本,其实ARM到迄今为止经历了6代版本,随着 ...

  8. ARM的体系结构与编程系列博客——ARM处理器系列介绍

    ARM处理器系列介绍 现在到了3月,过年过得过于舒服了.系列博客也停更了近半月,我果然是个慢(lan)性(gui)子,那么趁着到校的第一天晚上,就写一篇博客来继续我的系列博客了!众所周知,ARM处理器 ...

  9. ARM的体系结构与编程系列博客——ARM的历史与应用范围

    前言 最近我感觉自己比较浮躁,重来没有好好地沉下心来做一件事情,而且针对自己在专业水平上仍然还有很多欠缺,于是我想我应该为自己做些什么来证明一下自己真的是潜心研究东西的人,于是我萌生了一个想法,真正地 ...

随机推荐

  1. Sitecore CMS中如何命名项目名称

    如何在Sitecore CMS中命名项目,以及配置命名限制,“显示名称”是什么以及如何使用它. 任何其他名称的项目 当创建Sitecore的项目,内容编辑器要求制作者为新建项目提供名称.输入的名称将其 ...

  2. 【2017-03-28】JS基础、DOM操作

    一.JS基础 1.javascript功能 ⑴进行数据运算 ⑵控制浏览器功能 ⑶控制元素的属性.样式.内容 2.javascript位置和格式 可以放在html页的任意位置,也可以创建一个以js结尾的 ...

  3. 【2017-2-19】C#数据类型,数据转换,变量,常量,转义符

    数据类型 一.基本数据类型 1.值类型(不可以为null) ⑴整型(可以为负数) byle,int,short,long(从小到大排列) 常用整型 int a=值(小于10位数) long b=值(1 ...

  4. 【Scala学习之一】 Scala基础语法

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...

  5. MQ的使用场景

    一.消息队列概述消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有ActiveMQ,RabbitM ...

  6. javascript实现异步编程的4种方法

    1.回调函数. 2.事件监听 .  思路:采用事件驱动模式.任务的执行不取决于代码的顺序,而取决于某个事件是否发生 3.观察者模式 (发布/订阅模式)   代码如下: jQuery.subscribe ...

  7. (Review cs231n) Gradient Calculation and Backward

    ---恢复内容开始--- 昨日之补充web. 求解下图的梯度的流动,反向更新参数的过程,表示为 输入与损失梯度的关系,借助链式法则,当前输入与损失之间的梯度关系为局部梯度乘以后一层的梯度. ---恢复 ...

  8. 51nod 1057 N的阶乘 (大数运算)

    输入N求N的阶乘的准确值.   Input 输入N(1 <= N <= 10000) Output 输出N的阶乘 Input示例 5 Output示例 120 压位: 每个数组元素存多位数 ...

  9. Nginx入门简介

    Nginx入门简介 Nginx 介绍 Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二 ...

  10. k8s device plugin

    基本概念入门: Device Manager Proposal Device plugin offical Doc(中文) device-plugins offical Doc(En) Go thro ...