码迷,mamicode.com
首页 > 其他好文 > 详细

arm中断体系结构

时间:2017-12-31 16:05:31      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:中断向量   abort   info   条件   span   and   ict   init   异常   

    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,=4096  //设置栈  
   
   bl disable_watch_dog  //关闭看门狗

   msr cpsr_c, #0xd2     //0xd2--11100010b  (这里的I、F位置1,即禁止中断--未进行全部初始化,不能开中断)
   ldr sp, =3072  //进入中断模式,设置栈指针

   msr cpsr_c, #0xd3    //0xd3--11100011b
   ldr sp, =4096  //进入管理模式,设置栈指针(在复位异常中提前设置中断模式的栈指针,防止中断触发时栈指针未设置而系统崩溃)

   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汇编指令的知识:

  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--它们的内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行。

      技术分享图片

    

 

arm中断体系结构

标签:中断向量   abort   info   条件   span   and   ict   init   异常   

原文地址:https://www.cnblogs.com/darren-pty/p/darren_irq.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!