arm异常与中断

1 swi中断的处理步骤:

1) 进中断时pc->lr, cpsr->spsr, cpsr_mode置为特权模式,均由硬件完成。

2)注册中断向量表由软件完成,可以用B指令,也可以用ldr跟dcd表的方式,在中断向量处放置一条跳转指令,跳到中断处理handler处。

3)一级中断处理程序主要目的是根据arm或者thumb状态获取swi号,期间注意保存寄存器和返回。

4)二级中断处理程序可以用C或者汇编,主要是一个分支结构,根据中断号做相应的事,可以用函数指针方式实现。

-----应用程序中使用软中断时,可以使用__swi (仅armcc)关键字声明软中断函数,调用时自动获取中断号。

2 基于s3c2410的irq中断

先上个直接从芯片手册里截的图

 

 

 

前面的subsrcpnd srcpnd intpnd都是三星提供的sfr,是做到芯片里面的,它们的清零方式比较特殊,是对相应的位赋1,联想到外部中断的置一方式只能由外部事件驱动,所以这个也不难理解。

当中断被送到irq时处理步骤如下:

1 查跳到异常向量表0x18处,取一条跳转指令,跳转到一级irq中断处理函数中。

2 一级中断处理函数的任务是通过intoffset寄存器,查的中断源的偏移号,然后根据偏移号和基地址得到二级中断处理函数的地址,将此地址赋给pc,然后跳转到二级中断处理函数处。

3 二级中断处理函数可能还要查相应的寄存器,得到具体的中断源,然后进行相应的处理。

4 中断返回,因为进入中断时用户态的cpsr已经压入spsr中,所以可以直接用subs pc, lr, 4这种格式恢复。恢复原来的寄存器模式和状态。

to be continue。。。

posted @ 2011-09-08 02:12  jialejiahi  阅读(422)  评论(0编辑  收藏  举报