巴马阀怎么连接精密管:【2011.03.21】ARM中断处理流程 & ARM中断处理分析

来源:百度文库 编辑:偶看新闻 时间:2024/05/10 11:04:23

1.寄存器R16用作CPSR(Current Program Status Register,当前程序状态寄存器)CPSR可在任何运行模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位,以及其他一些相关的控制和状态位。

每一种运行模式下又都有一个专用的物理状态寄存器,称为SPSR(Saved Program Status Register,备份的程序状态寄存器),当异常发生时,SPSR用于保存CPSR的当前值,从异常退出时则可由SPSR来恢复CPSR。

由于用户模式和系统模式不属于异常模式,他们没有SPSR,当在这两种模式下访问SPSR,结果是未知的

   当中断产生的时候,把CPSR保存在SPSR是自动完成的。

 

对异常的响应

当一个异常出现以后,ARM微处理器会执行以下几步操作: (这些是中断发生时,自动处理的

1、将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。若异常是从ARM状态进入,LR寄存器中保存的是下一条指令的地址(当前PC+4或PC+8,与异常的类型有关);若异常是从Thumb状态进入,则在LR寄存器中保存当前PC的偏移量,这样,异常处理程序就不需要确定异常是从何种状态进入的。例如:在软件中断异常SWI,指令MOV PC,R14_svc总是返回到下一条指令,不管SWI是在ARM状态执行,还是在Thumb状态执行。

2、将CPSR复制到相应的SPSR中。

3、根据异常类型,强制设置CPSR的运行模式位。

4、强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。

还可以设置中断禁止位,以禁止中断发生。

如果异常发生时,处理器处于Thumb状态,则当异常向量地址加载入PC时,处理器自动切换到ARM状态

 

从异常返回

异常处理完毕之后,ARM微处理器会执行以下几步操作从异常返回:

1、将连接寄存器LR的值减去相应的偏移量后送到PC中。

2、将SPSR复制回CPSR中。

3、若在进入异常处理时设置了中断禁止位,要在此清除。

可以认为应用程序总是从复位异常处理程序开始执行的,因此复位异常处理程序不需要返回。 ======================================================================================== 【ARM中断处理分析】 中断是CPU提供的一个基本的功能;中断的基本含义应该是允许CPU在执行某个代码序列的过程中停下来执行另外一个代码序列,这里有两层意思,一个是要切换到另一个场景,另一个是当执行完毕之后必须能够恢复原来的场景。首先讨论如何才能切换到一个新的场景,当一条指令的执行完之后,CPU会检查有没有中断产生,如果有就halt当前流水线。重载PC寄存器后重新启动流水线。ARM7一般为3级流水线价格,分别是取指、译码和执行。PC寄存器中存放的是当前时刻(CPU机器时钟周期)取指操作的目标地址,即CPU即将执行的指令的地址由PC寄存器指定,正常情况下PC指针的内容是CPU自动调整的——每个时钟周期自动+4,在发生跳转时,可以通过直接执行修改PC值的指令来实现。中断的本质就是一次跳转,跟函数调用其实没有什么分别(只不过增加了一些硬件支持),所以这里第一步是将PC值写成对应的中断入口地址,比如IRQ就是0x18.接下来还需要切换ARM的内核模式到相应的中断模式。写完PC值以后,下一个时钟周期流水线就开始从0x18处取指,然后译码、执行。中断入口地址处存放的是中断向量表,所谓中断向量就是另一个跳转指令,比如LDR     PC, [PC,#24] ,执行完这个跳转之后理论上CPU就已经从一个新的地址开始执行了。这个过程的实现是软硬件结合的结果,硬件负责第一次加载PC,而软件负责再次修改PC值,将程序指向指定的代码序列。还必须考虑如何恢复原执行场景,这里跟刚才一样,一部分工作由硬件实现,另一部分必须由软件负责实现。因为第一次修改PC到中断入口地址是硬件完成的,所以第一次保存中断现场的工作也只能由硬件完成,这个工作包括将PC被修改前的值保存到LR_irq寄存器中,并将当前PSR寄存器的值保存到SPSR_irq中。为了实现中断嵌套,可能硬件还需要将当前中断信息压栈(硬件栈,而不是内存)以便当嵌套发生时用于恢复。当程序执行到ISR后,硬件的工作基本完成,软件代码将在当前CPU模式下运行,这可能会修改LR和PSR等寄存器,所以在执行中断处理代码之前需要对这两个寄存器进行保护,否则一旦被破坏以后就无法恢复。这里同样需要保护的还包括工作寄存器等。软件的职责还包括清掉设备中断标志。最后,当ISR结束时,软件负责将CPU恢复到中断前的状态,然后利用已保存的LR地址跳转到中断时执行代码的下一行代码开始继续执行。当涉及到中断嵌套的情况时,重复上述过程,只是硬件此时不需要在改变CPU的工作模式。当涉及到有操作系统的时候,这个过程会变得稍微复杂一些。首先在进入中断之前OS需要记录当前中断嵌套的层数,并且在中断退出之后恢复到被中断上下文之前做一次判断,因为中断程序可能改变当前就绪态优先级最高的任务,如果此时优先级最高的任务不再是先前被中断的任务时,得到恢复并继续执行的将是该当前优先级最高的就绪态的任务。这里只有在中断嵌套层数为0时OS才会提供这样一次机会,否则将恢复到被中断的ISR中继续执行中断处理程序。