异常优先级:

 

ARM处理器的异常空间:

 

在所有异常的入口,IRQ 中断被屏蔽 ,只有重新被使能才可触发内核响应。(如:中断嵌套处理)

在 FIQ 和 Reset 异常的入口,FIQ中断被屏蔽。

ARM处理器响应异常的过程如下(只能在ARM状态下完成):

  1. CPSR寄存器的内容——复制——> SPSR_寄存器(对应模式下)

  2. 返回地址(PC值)——保存——> LR_寄存器(对应模式下)

  3. 对 CPSR 寄存器的一些控制位进行设置:

    1. 无论发生异常时处理器处于Thumb 状态还是ARM状态,响应异常后处理器都会切换到 ARM 状态,即CPSR[5]=0;
    2. 模式位 CPSR[4:0]设置为被响应异常的模式编码;
    3. 设置中断屏蔽位:如果异常模式为Reset 或 FIQ 则

    CPSR[6]=1 禁止快速中断

    CPSR[7]=1 禁止正常中断

    1. 程序计数器(PC)设置为异常向量的地址

异常处理程序返回时(执行特定的异常返回指令,需注意对于复位异常不需要返回,只能在ARM状态下完成),处理器执行下列动作:

  1. SPSR_的内容——恢复——> CPSR
  2. 将PC设置为LR_ 的值

图解APM CPU进入IRQ异常模式:

 

异常返回地址的纠正:(ARM7的三级流水线)

异常类型 ARM指令下正确的返回地址 地址纠正的原因
复位 —— 复位没有定义lr
数据中止 lr-8 发生异常的指令已执行,PC寄存器的值已更新Lr值为下一条指令的下一条地址,但需指向导致数据中止异常的那条指令
FIQ lr-4 发生异常的指令已执行,PC寄存器的值已更新Lr值为下一条指令的下一条地址,且需FIQ处理程序的返回地址(发生异常的下一条)
IRQ lr-4 发生异常的指令已执行,PC寄存器的值已更新Lr值为下一条指令的下一条地址,且需IRQ处理程序的返回地址(发生异常的下一条)
指令预取中止 lr-4 发生异常的指令未执行,PC寄存器的值未更新Lr值为下一条指令的地址,但需指向导致预取指令中止异常的那条指令
SWI lr 发生异常的指令未执行,PC寄存器的值未更新Lr值为下一条指令的地址,且需指向SWI指令的下一条指令
未定义指令 lr 发生异常的指令未执行,PC寄存器的值未更新Lr值为下一条指令的地址,且需指向未定义指令的下一条指令

注意:

  1. 发生异常时的PC寄存器是否已更新,已更新,则Lr值为下一条指令的下一条地址;未更新,则Lr值为下一条指令的地址。
  2. 异常返回后被打断的当前指令是否还需要执行。
  3. 主要是受ARM处理器流水线的影响

     

    例如:SWI常用中断返回方式:

    MOVS PC,R14 ;更新PC值,加S表示将SPSR加载到CPSR

例如:FIQIRQ常用中断返回方式

SUBS PC,R14,#4 ;重新执行发生异常的指令

 

如果链接寄存器的内容被压入堆栈中保存,并且压栈前返回地址已经被矫正。

可用LDMFD sp!,{pc}^来表示。

LDMFD为数据出栈指令,

“!”表示改变sp的值,

“^”表示更新状态,将SPSR的值赋给CPSR。

 

注意:如果使用MOV指令,地址值必须是合法的ARM立即数(能够通过一个0~255范围内的数通过右循环偶数位得到)

 

以下特性能够让CPU Core能够尽快地响应FIQ中断:

  1. FIQ 向量在异常向量表的最后,这样使FIQ处理程序可以直接从FIQ向量处开始,省去了跳转的时间开销;
  2. FIQ 模式下有五个额外的寄存器 (r8_FIQ to r12_FIQ),对于这些寄存器在进入和推迟FIQ时无须保存和恢复,节省了时间;

 

ARM支持大端小端的内存数据方式,可以通过硬件的方式设置(没有提供软件的方式)端模式。

小端是低位存低地址,大端是高位存低地址。

 

I/O端口编址方式:

 

存储器映射编址 I/O映射方式
优点 •可采用丰富的内存操作指令访问I/O单元 •无需单独的I/O地址译码电路 •无需专用的I/O指令 •I/O单元不占用内存空间 •I/O程序易读
缺点 •外设占用内存空间 •I/O程序不易读 I/O操作指令仅有单一的传送指令,I/O接口需有地址译码电路
举例 ARM中,I/O端口与内存单元统一编址 Intel 80X86系列,I/O端口与内存单元分开编址,I/O端口有自己独立的地址空间,其大小为64KB