程序状态寄存器(CPSR)

Mode位[4:0]:处理器模式为

  USER模式不能直接切换到特权模式,在特权模式下可以直接修改mode位[4:0]为10000,切换到USER模式。

 

T bit位[5]:处理器状态位

  T = 0,J= 0处于ARM指令集状态

  T = 1,J= 0处于Thumb指令集状态  

  T = 1,J = 1处于ThumbEE指令集状态

中断禁止位[7:6]

  I = 1 进制IRQ

  F = 1 进制FIQ

条件位[31:27]

  • N位  Negative result from ALU  ALU运算结果为一个负数时, 此为自动置 1 否则为 0
  • Z位  Zero result from ALU  ALU运算结果为 0 时,此位自动置 1,否则为 0
  • C位  分为加法运算和减法运算两种情况:
  1. 进行加法运算,如果产生进位 C位自动置一
  2. 进行减法运算时,如果产生借位, C位自动置 0
  • V位  符号位溢出,(最高为产生变化,针对于有符号数来说) V位自动置 1

      计算机系统中,所有的数据都以 二进制补码 方式存储。

   

arm架构的最新版本 arm架构最新消息_指令集

异常处理                                                                                                         

ARM 有 7 类中断源:

偏移量  异常类别
1.   0x1C  FIQ 快速响应中断
2.   0x18  IRQ  外部中断
3.   0x10  Data Abort  数据终止  当访问数据时,CPU不允许访问请求 会进入此种中断
4.   0x0C  Perfetch Abort
5.   0x08  software interrupt
6.   0x04  Undefined Instruction  指令未定义异常  CPU取出一条指令,如果不能执行,此时会  将数据交由协处理器执行。若没有协处理器或者协处理器也不能处理,就会触发此中断
7.   0x00  Reset  复位中断
7种异常对应的5种模式
异常源:  FIQ  IRQ  Reset/软中断      DataAbort/PerfetchAbort       Undef
CPU模式:  FIQ  IRQ  Supervisor(SVC)  Abort                   Undef

异常处理过程:

  当异常产生异常时,ARM core(自动执行但不包括压栈操作):

  • 拷贝 CPSR(current program status register)内容到 SPSR_<mode>(saved program status     register)<mode>指的是具体哪一个状态的SPSR
  • 设置适当的 CPSR 位:
  1. 改变处理器状态进入ARM状态(处理异常时,必须在ARM状态下进行)
  2. 改变处理器模式进入相应的异常(特权)模式
  3. 设置中断禁止位,防止中断处理过程中产生中断(如果需要)

       Cortex A系列处理器,不允许同一类的中断嵌套   (处理FIQ时,不响应IRQ;处理IRQ时,可嵌套FIQ)

  • 保存返回地址到 lr_<mode>
  • 设置 pc 为相应的异常向量
  • ARM7、ARM9的异常向量表固定为0x00开始的一端内存中,cortex A系列默认为 0x00 但可以手动设置

  返回时,异常处理需要(中断处理程序中手动执行):

  • 从 SPSR_<mode>恢复 CPSR
  • 从 lr_<mode> 恢复 PC
  • Note:这些操作只能在 ARM 状态执行

异常源类型,对应处理器模式。

 

异常优先级
  Reset ——> Data Abort ——> FIQ > IRQ ——> Prefetch Abort ——> SWI→Undefined

 

FIQ 比 IRQ 快? 三方面原因:

  1. FIQ优先级高
  2. FIQ在中断向量表的最高偏移地址,在编程时可以直接在FIQ后面添加中断处理程序,省去了跳转指令。
  3. FIQ有多个私有寄存器(r8_r14),在中断处理程序中使用这几个寄存器时可以省去压栈,弹栈操作

指令流水线

三级流水线:

PC(program count)指向正在取指的指令。

PC - 4 为正在译码的指令。

PC - 8 为正在执行的指令。

arm架构的最新版本 arm架构最新消息_指令集_02