lv11 嵌入式开发 ARM体系结构理论基础(异常、微架构)4

1 异常概念

处理器在正常执行程序的过程中可能会遇到一些不正常的事件发生

这时处理器就要将当前的程序暂停下来转而去处理这个异常的事件    

异常事件处理完成之后再返回到被异常打断的点继续执行程序

lv11 嵌入式开发 ARM体系结构理论基础(异常、微架构)4_第1张图片

2 异常处理机制

不同的处理器对异常的处理的流程大体相似,但是不同的处理器在具体实现的机制上有所不同;比如处理器遇到哪些事件认为是异常事件遇到异常事件之后处理器有哪些动作、处理器如何跳转到异常处理程序如何处理异常、处理完异常之后又如何返回到被打断的程序继续执行等我们将这些细节的实现称为处理器的异常处理机制

3 ARM异常源

概念    

导致异常产生的事件称为异常源  

ARM异常源    

  1. FIQ                快速中断请求引脚有效(速度最快的中断)             
  2. IRQ                外部中断请求引脚有效    
  3. Reset            复位电平有效    
  4. Software Interrupt    执行swi指令(软件中断)     
  5. Data Abort            数据终止(访问无效内存地址、数据损坏或其他类似问题导致)     
  6. Prefetch Abort        指令预取终止(无效的指令地址或类似的预取相关问题导致的异常)     
  7. Undefined Instruction    遇到不能处理的指令(取指令译码不认识)

4 ARM异常模式

在ARM的基本工作模式中有5个属于异常模式,即ARM遇到异常后会切 换成对应的异常模式

lv11 嵌入式开发 ARM体系结构理论基础(异常、微架构)4_第2张图片

注意:Arm模式5种与异常源7种,不要搞混

5 ARM异常响应

ARM产生异常后的动作(自动完成

1.拷贝CPSR中的内容到对应异常模式下的SPSR_    

2.修改CPSR的值     

        2.1.修改中断禁止位禁止相应的中断     

        2.2.修改模式位进入相应的异常模式                  

        2.3.修改状态位进入ARM状态    

3.保存返回地址到对应异常模式下的LR_    

4.设置PC为相应的异常向量(异常向量表对应的地址)

lv11 嵌入式开发 ARM体系结构理论基础(异常、微架构)4_第3张图片

lv11 嵌入式开发 ARM体系结构理论基础(异常、微架构)4_第4张图片

不管之前是Thumb状态还是ARM状态,处理异常必须在ARM状态下。

因为异常处理程序是我们自己写的,地址是不确定的,那么系统自动跳转是找不到的,系统会跳转到固定的位置,异常向量表。

5 异常向量表

lv11 嵌入式开发 ARM体系结构理论基础(异常、微架构)4_第5张图片

> 异常向量表的本质是内存中的一段代码    

> 表中为每个异常源分配了四个字节的存储空间    

> 遇到异常后处理器自动将PC修改为对应的地址    

> 因为异常向量表空间有限一般我们不会再这里,写异常处理程序,而是在对应的位置写一条跳 转指令使其跳转到指定的异常处理程序的入口    

注:ARM的异常向量表的基地址默认在0x00地址        

但可以通过配置协处理器来修改其地址

7 异常返回

ARM异常返回的动作(自己编写)

1.将SPSR_的值复制给CPSR      

        使处理器恢复之前的状态                     

2.将LR_的值复制给PC      

        使程序跳转回被打断的地址继续执行

8 IRQ异常举例

lv11 嵌入式开发 ARM体系结构理论基础(异常、微架构)4_第6张图片

异常向量表中N是异常处理程序的跳转地址

M是用户程序的下个执行地址,lr保存。

整个过程CPSR保存的永远是当前程序运行状态    

SPSR只是异常时对原来的CPSR进行备份

9 异常优先级

多个异常同时产生时的服务顺序

lv11 嵌入式开发 ARM体系结构理论基础(异常、微架构)4_第7张图片

10 FIQ和IRQ

 1. FIQ在异常向量表位于最末        

        可直接把异常处理写在异常向量表之后,省去跳转    

2. FIQ模式有5个私有寄存器(R8-R12)     

        执行中断处理程序前无需压栈保存寄存器,可直接处理中断    

3. FIQ的优先级高于IRQ     

        3.1 两个中断同时发生时先响应FIQ     

        3.2 FIQ可以打断RIQ,但RIQ不能打断FIQ

11 练习

以IRQ为例,简述ARM处理器在正常执行程序过程中如果遇到IRQ异常会自动完成哪些动作以及处理完异常后如何返回到正常程序

1 保存当前状态:

spsr_ = cpsr  保存(CPSR)等寄存器的值,保存lr_irq的值以便在处理完异常后能够恢复到中断发生前的状态。

2 跳转到IRQ异常处理模式:
irq模式切换、irq禁止(防止打断)、cpsr修改为arm状态。为了确保在处理IRQ异常时能够使用相关的寄存器和堆栈。
跳转至异常向量表,寻找irq的地址,地址中存在用户自己写的异常处理程序地址,执行异常处理程序。

3 模式恢复
包括恢复之前的执行模式、寄存器的值等。cpsr = spsr,程序PC指针指向lr_irq,继续执行原始的程序。

12 微架构

lv11 嵌入式开发 ARM体系结构理论基础(异常、微架构)4_第8张图片

lv11 嵌入式开发 ARM体系结构理论基础(异常、微架构)4_第9张图片

lv11 嵌入式开发 ARM体系结构理论基础(异常、微架构)4_第10张图片ARM指令流水线    

ARM7采用3级流水线    

ARM9采用5级流水线    

Cortex-A9采用8级流水线    

注1:虽然流水线级数越来越多,但都是在三级流水线的基础上进行了细分

PC的作用(取指)    

不管几级流水线,PC指向的永远是当前正在取指的指令,而当前正在执行的指令的地址为PC-8(PC地址减去2个4字节即取址)

指令流水线机制

指令流水线机制的引入确实能够大大的提升指令执行的速度,但在实际执行程序的过程中很多情况下流水线时是无法形成的,比如芯片刚上电的前两个周期、执行跳转指令后的两个周期等,所以指令流水线的引入以及优化只能使平均指令周期不断的接近1而不可能真正的达到1,且流水线级数越多芯片设计的复杂程度就越高,芯片的功耗就越高

多核处理器

lv11 嵌入式开发 ARM体系结构理论基础(异常、微架构)4_第11张图片

多核处理器    

        即一个SOC中集成了多个CPU核  

作用    

        不同的线程可以运行在不同的核心中 ,做到真正的并发

资源    

        多核处理器共用外设与接口资源

你可能感兴趣的:(嵌入式开发,arm开发)