中断和异常(1) 未定义异常

下面的图是2440的中断向量表

 我们可以看到这个中断向量表是4字节对齐 

其中 supervisor 的模式表示的是管理模式 此模式相当于管理员模式 可以访问硬件,如果死机则需要重启

undefined 模式 当命令或者地址不是2440所定义的命令 则触发其中断

FIQ 快速中断模式

IRQ 普通中断模式

其中可以看到未定义指令异常是在04这个地方

1. 首先看手册

这里是异常中断之后的寄存器,其中加灰色三角的表示此寄存器是唯一的 不与其他的寄存器共用,只是当进入此模式的时候才使用其寄存器。比如undefined mode 自己的寄存器是R13 和 R14里面分别存的是R13 是这个模式下的栈 需要存入栈的地址。R14是存入发生异常之后那条命令的地址 用来返回原先程序 R15是PC指针。 

当发生异常的时候 CPU会做如下事情(ARM 模式下):

                                                            1.  ARM会自动的把这个异常的下一句话保存到R14

                                                            2. 把之前的CPSR的状态拷贝到SPSR

                                                            3. 根据发生不同的异常 CPSR会发生了变化 (如下图)

                                                            4.  PC会指向中断的片段。。

 程序要做的事情是:

                               1. 我们需要保存R1-R12 和 R14的数据 包括一般数据和返回主程序的地址 保存在栈里面

                               2.  在中断中处理信息 (注意 R0 和 R1存可存入C语言的函数入口变量)

                               3. 把所有的寄存器的数据弹出栈,把R14返回的地址给PC

ldr sp ,= 0x34000000             //先建立栈
stmdb sp!, {r0, r12, lr}            //把数据存入栈

msr r0, cpsr /*把CPSR 的值读入r0*/          
ldr r1, = und_string
bl print_und

/**恢复现场**/
ldmia sp, {r1, r12, pc}^       //恢复现场

猜你喜欢

转载自www.cnblogs.com/shwzh1990/p/11840512.html
今日推荐