本文共 2108 字,大约阅读时间需要 7 分钟。
在ARM体系中,程序执行的流程有三种:
要了解ARM处理异常中断的流程原理,就要先熟悉一下ARM的工作模式与寄存器。
各种模式的简要介绍如下:
ARM体系中的异常中断种类如下图:
可以看出,异常中断的种类与ARM的模式基本对应。ARM中要进入异常中断的处理程序,首先要触发异常中断的条件,然后通过异常中断向量表跳转到相应的异常中断处理程序的地址中去执行程序,当同时触发多个异常中断,就涉及到异常中断的优先级问题了。
中断向量表中指定了异常中断及其处理程序的对应关系,通常存放在存储地址低端,ARM体系中,异常中断向量表的大小是32字节,每个异常中断占据4个字节大小。这4字节大小的空间中一般存放一个跳转指令或者是一个向PC赋值的数据访问指令(这样也可以跳转程序),具体的向量表如下:
在相应的地址中,存放着程序跳转指令,当发生异常中断时,程序就会指向向量表中的相应地址(与中断种类对应),然后执行地址中的指令,通过地址中的程序跳转指令跳转到异常中断处理程序中,或者是执行重启等相关操作。当有多个异常中断同时发生的时候,就要给不同的异常中断规定不同的优先级了,各异常中断的优先级如下:
关于不同异常中断有相同的优先级问题,是因为有些异常中断是不可能同时发生的。不同的ARM模式下对应的寄存器也是不一样的,而且在处理异常中断的时候保持现场、转换模式、恢复现场等操作的实现都需要用到寄存器。
ARM920T中有31个通用寄存器和6个程序状态寄存器,一共37个寄存器,37个寄存器分为七组(与七种模式相对应),进入哪个模式就使用哪组的寄存器,有些寄存器是共用的、有些寄存器在不同的模式下有独有的副本,这些独有的寄存器称为备份寄存器,在图中用灰色三角做了标记: 通用寄存器 r0~r15的寄存器都可以直接访问,除了r15都是通用寄存器,通用寄存器既可以用于保存数据也可以保存地址,其中r13、r14这两个寄存器比较特殊。r13又称为栈指针寄存器sp,常用于保存栈指针。r14又称为程序连接寄存器lr,用于保存发生异常时的指令地址,在程序跳转的时候lr得到pc的备份,以便于恢复现场。程序状态寄存器
每种模式下除了r0~r15寄存器之外,还共有一个程序状态寄存器CPSR,顾名思义CPSR寄存器中位用来标识当前模式的状态。当程序切换工作模式的时候,要将原来工作模式的信息(也就是CPSR)存储在SPSR中进行保存,以便恢复现场。CPSR寄存器中每个位相应的作用如下: 其中条件代码解释如下: 控制位解释如下:另外,PSR中的其余位是保留的。在更改PSR的标志或控制位时,必须确保这些未使用的位没有被更改
注意:还可以设置中断禁用标志,以防止异常的难以管理的嵌套
lr与pc的偏移量的关系如示:
从异常中断中返回时的操作与进入异常中断时的操作对称的:
1.将lr寄存器减去适当的偏移量,赋值给pc,恢复到原来的指令地址中。 2.将SPSR中保留的值返回给CPSR,恢复原来的CPSR。 3.清除中断禁用标志(如果它们是在进入时设置的)。参考资料:杜春雷《ARM体系结构与编程》
转载地址:http://yvwzi.baihongyu.com/