ARM异常处理程序设计(初级)

来源:互联网 发布:网络信号检测下载 编辑:程序博客网 时间:2024/05/17 00:16

1、异常处理:
arm处理器的运行模式有:
SVC(管理模式):复位、执行SWI指令,供操作系统使用的一种保护模式
FIQ(快速中断模式):发生高优先级中断,用于高速数据传输或通道处理
IRQ(中断模式):发生低优先级的中断,用户通用的中断处理
Abort(中止模式):用于虚拟存储或存储保护
Undef(未定义模式):当未定义的指令执行时进入该模式
User(用户模式):正常程序执行的模式,用于应用程序
System(系统模式):用于运行特权级的操作系统任务
另外,在除User(用户模式)外的其他6种处理器模式成为特权模式,则User模式为非特权模式。
User、System成为非异常模式,其他5种则称之为异常模式。
扩展:
处理器的模式通过软件进行切换,也可以通过外部中断或异常处理过程进行切换。大多数的用户程序运行在用户模式下,这时,应用程序不能访问一些受到操作系统保护的资源,应用程序也不能直接进行处理器的模式切换。当需要进行处理器的模式切换时,用用程序可以产生异常,在异常处理的过程中进行处理器模式的切换。这种体系结构可以使操作系统控制整个的系统资源。
当程序发生异常中断使,处理器进入相应的异常模式。在每一种异常模式中都有一组寄存器,提供相应的异常程序使用,这样可以保证进入异常模式时,用户模式下的寄存器不被破坏。
系统模式并不是通过异常过程进入的,它和用户模式具有一样的寄存器,但是系统模式数据特权模式,可以访问所有的系统资源,也可以直接进行处理器模式的切换,它主要提供系统任务使用。

异常:
1)复位异常,进入到管理模式(SVC)
2)未定义指令异常,进入未定义模式
3)软中断异常,执行SWI模式,进入SVC管理模式
4)预取指令异常,没有取到指定的指令,进入中止模式
5)数据中指异常,没有取到指定的数据,进入中止模式
6)中断,进入中断模式
7)快速中断,进入快速中断模式
2、异常发生时如何处理异常:
CPU做:
1)拷贝CPSR到相应的异常模式的SPSR,SPSR_mode=CPSR
2)设置适当的CPSR位:
A、将处理器的状态改为ARM状态,CPSR的bit[5]=0
B、改变处理器的工作模式,进入到相应的异常模式,改变CPSR的bit[4:0]到对应的异常模式
C、设置中断禁止位
3)保护返回地址到 lr_mode = PC - 4
4)设置PC为相应的异常向量的地址
5)处理异常,执行异常处理程序
6)异常处理完毕,返回
3、中断处理
1)预取指令异常:
……
sub r1, r1, #0x6
add r0, r0, #0x1
bic r0, r0, #0xF
cmp r0, r1
……
A、当sub取指,根本没有取到,直到sub进入执行阶段,发生异常
B、lr=PC-4(PC=bic)
=add
C、异常返回,再次取指sub指令,subs pc, lr , #4

2)软中断SWI指令
……
sub r1, r1, #0x6
swi 1 @发生软中断异常
add r0, r0, #0x1
bic r0, r0, #0xF
……
取指,解码,执行,在swi指令的第三个阶段,执行阶段,发生异常
A、SPSR_SVC=CPSR
B、改CPSR的T位,0,即ARM状态
C、改CPSR的mode位[4:0],改到SVC管理模式
D、禁止中断位
E、保存返回地址lr_mode = PC – 4 (PC = bic) = add
F、PC=0x8
G、处理异常,执行异常处理程序
H、异常处理完毕,异常返回,返回到add指令继续执行,
movs pc, lr ,CPSR=SPSR_SVC
3)未定义指令异常
……
sub r1, r1, #0x6
abc #3 @发生未定义指令异常
add r0, r0, #0x1
bic r0, r0, #0xF
……
取指,解码,执行,当abc未定义指令进入执行阶段,发生异常
A.SPSR_und = CPSR
B.改CPSR的T位,0
C.改CPSR的mode[4:0],改到未定义模式
D.禁止中断位
E.lr=PC-4 (PC=bit)
=add
F.PC=未定义异常的向量表入口
G.处理未定义异常
H.异常处理完毕,异常返回到add指令继续执行,
movs pc, lr CPSR=SPSR_und

4)FIQ IRQ
……
sub r1, r1, #0x6
add r0, r0, #0x1
bic r0, r0, #0xF
cmp r0, r1
……
当执行到sub指令时,来了中断,虽然中断来了,等sub指令执行完毕,处理中断
lr=PC-4 (PC=cmp)
=bic
异常返回时,执行add指令,subs pc, lr, #4 CPSR = SPSR
5)数据异常
……
ldr r0, [r2] //取指,解码,执行,访存,回写
sub r1, r1, #0x6
add r0, r0, #0x1
bic r0, r0, #0xF
cmp r0, r1
……
A.在ldr指令的访存阶段发生异常,PC=bic
B.lr=PC-4=add
C.异常返回,再次取指ldr指令,subs pc, lr ,#8

总结:异常的返回
swi软中断异常
未定义的指令异常
中断
快速中断
预取指令
数据异常
1、何时发生异常?
执行阶段 8 (swi 、未定义、预取指令)
执行完毕阶段 12(中断、快速中断)
访存阶段 12 (数据异常)
根据PC值确定当前的PC值
2、CPU:自动的将 lr = pc -4 确定当前lr保存的谁的地址
3、异常处理完毕,返回时,执行的指令是哪一条
1)重新执行发生异常的指令(预取指令,数据异常)
2)执行发生异常的下一条指令

     异常向量表——————————————————————

0x1C | ldr pc,fiq_hdl | 快速中断异常
0x18 | ldr pc,irq_hdl | 中断异常
0x14 | b . | 保留
0x10 | ldr pc,dat_hdl | 数据异常
0xC | ldr pc,pre_hdl | 预取指令异常
0x8 | ldr pc,swi_hdl | 软中断异常
0x4 | ldr pc,und_hdl (修改PC) | 未定义异常
0x0 | b reset | 复位异常
—————————— |
异常向量表只是起到一个异常跳转的作用
4、异常优先级
异常在当前指令执行完成后才被响应,多个异常可以在同一时刻产生
异常指定了优先级的固定顺序:
Reset
Data Abort
FIQ
IRQ
Prefetch Abort
SWI
Udefined instruction
5、软中断
系统在执行代码,执行到SWI 0x01指令,在该指令的执行阶段,发生软中断异常
CPU:
1)备份CPSR ,SPSR_SVC = CPSR
2)修改CPSR
    改状态,ARM状态,CPSR 的bit[5]= 0
    改模式,SVC管理模式,CPSR的bit[4:0]= 10011
 3) 保存返回地址 lr_svc = PC - 4
 4)保存PC为异常向量表中对应的地址,PC = 0x8,对应的指令“
 ldr pc,swi_hdl
 5)swi_hdl就是SWI
6)当c函数处理完毕之后,返回汇编swi_hdl,再做最后的异常返回
7)movs pc,lr   cpsr  = spsr
8)继续执行swi_hdl之后下一条的指令

0 0
原创粉丝点击