s3c2410中断控制器
- 格式:doc
- 大小:29.50 KB
- 文档页数:3
一、CPU处理外部事件的方法
CPU运行过程中,如何知道各类外设发生了某些不预期的事件,主要有以下两个方法:
1、查询方式:程序循环地查询各设备的状态并作出相应反应;缺点是占用CPU资源过高,不适合用于多任务系统;
2、中断方式:当某件事发生时,硬件会设置某个寄存器,CPU在每执行完一个指令时,通过硬件查看这个寄存器,如果发现所关注的事件发生了,则中断当前程序流程,跳转到一个固定的地址处理这件事,最后返回继续执行被中断的程序;
二、S3C2410的中断控制器中寄存器的功能
SUBSRCPND 和SRCPND寄存器表明哪些中断被触发了,正在等待处理;
SUBMASK(INTSUBMASK)和MASK(INTMASK)用于屏蔽某些中断;
通过读取INTPND 或 INTOFFSET(2410/2440)来确定中断源;
INTMOD用于设置中断方式(FIQ或IRQ),同一时间,只能有一位被设为1;
PRIORITY用于设置仲裁器中各中断的优先级以及仲裁器中优先级是否可变;
三、S3C2410中断控制器的工作原理
1、Request sources(without sub-register)中的中断源被触发后,SRCPND 中相应位被置1,如果该中断在INTMASK中没有被屏蔽,或者是快速中断的话,将被进一步处理;
2、Request sources(with sub-register)中的中断源被触发后,SUBSRCPND 中相应位被置1,如果该中断在INTSUBMASK没有被屏蔽的话,它在SRCPND中的相应位也被置1,之后的处理就和Request sources(without sub-register)一样了;
3、如果被触发的是快速中断(FIQ),则CPU进入快速中断模式(FIQ Mode)进行处理;
4、对于一般中断IRQ,可能同时有几个中断被触发,未被INTMASK屏蔽的中断经过比较后,选出优先级最高的中断,然后CPU进入中断模式(IRQ Mode)进行处理;
5、中断服务程序可以通过读取INTPND或INTOFFSET来确定中断源,从而执行相应的处理;
四、中断处理前的准备工作
1、设置好中断模式和快速中断模式下的栈;
2、准备好中断处理函数;
(1)异常向量:在异常向量表中设置好当进入中断模式或快速中断模式时的跳转函数,它们的异常向量地址分别为0x0000_0018 、0x0000_001c
(2)中断服务程序(ISR):IRQ、FIQ的跳转函数,最终将调用具体中断的服务函数
(3)清除中断:可以在调用ISR之前清除中断,也可以在调用ISR之后清除中断;
清除中断从源头开始:
1.需要的话,操作具体外设清除中断信号;
2.清除SUBSRCPND、SRCPND中的相应位(往相应位写1即可)
3.清除INTPND中的相应位(往相应位写1即可)
3、进入或退出中断模式或快速中断模式时,需要保存、恢复中断程序的运行环境
(1)对于IRQ,进入和退出的代码如下:
sub lr ,lr,#4 ;计算返回地址
stmdb sp!,{r0—r12,lr} ;保存使用到得寄存器
……;中断处理
ldmia sp!,{r0—r12,pc}^
;中断恢复,^表示将spsr的值赋给cpsr
(2)对于FIQ,进入和退出的代码如下:
sub lr ,lr,#4 ;计算返回地址
stmdb sp!,{r0—r7,lr} ;保存使用到得寄存器
……;快速中断处理
ldmia sp!,{r0—r7,pc}^
;快速中断返回,^表示将spsr的值赋给cpsr
4、根据具体中断设置外设:比如GPIO中断,需要将相应引脚功能设为外部中断、设置中断触发条件(上跳沿触发…),一些中断拥有自己的屏蔽寄存器,还要开启它;
5、对于Request sources(without sub -register)中的中断,将INTSUBMANSK 寄存器中相应位设为0;
6、设置INTMOD、PRIORITY;
7、设置INTMASK;
8、设置CPSR中的I 和F 位,使能IRQ 或FIQ;。