中断向量控制器和中断处理的主要寄存器2

中断向量控制器和中断处理的主要寄存器

--参考朱有鹏ARM裸机

1、异常处理的2个阶段

可以将异常处理分为2个阶段来理解,第一阶段是异常向量表跳转

第二阶段就是进入了真正的异常处理程序irq_handler之后的部分。


2、中断处理的第一阶段处理

(1)第一个阶段之所以能够进行,主要依赖于CPU设计的提供的异常向量表机制

第一阶段的主要任务是从异常发生到响应异常并且保存、恢复现场,

跳转到真正的异常处理程序处。

(2)第二阶段的目的是识别多个中断源中究竟哪一个发生了中断,

然后调用相应的中断处理程序来处理这个中断。


3、S3C2440的第二阶段的处理过程

(1)第一个问题:怎么找到具体是哪个中断:S3C2440的中断控制器中有一个寄存器

寄存器的每一位对应一个中断源(那么一个寄存器应该对应于32个中断源)

但是S3C2440中中断源不止32个,所以2440里面又弄了一个子中断寄存器。

(2)怎么找到对应的ISR函数的问题?

首先给每个中断做了一个编号,进入ISR_handler之后先通过查询中断控制器和

相应 的子中断寄存器确定是什么中断源。

然后用这个编号去ISR数组(ISR数组是中断初始化事先设定好的)

就是把各个中断的ISR的函数名组成一个数组,用中断对应的编号作为索引来查询这个数组


4、S5PV210的第二阶段处理过程

(1)第一个问题,怎么找到具体是哪一个中断:S5PV210中支持的中断源很多,所以

直接设计了4个中断寄存器,每个32位,每位对应于一个中断源。

(理论上210最多支持128个中断源)

210没有子中断源,每个中断都是并列的,当中断发生时,轮询的查找是哪个中断源寄存器

,看哪一位被置1,则这个位对应的寄存器就发生了中断,即找到了中断编号。


(2)第二个问题:怎么找到对应的ISR问题

210支持的中断很多,如果还是使用2440的中断函数数组的话,查找起来非常的花

时间。于是210开拓了一种全新的寻找ISR的机制。

210提供了很多寄存器来解决每个中断源对应ISR寻找问题,

实现的效果就是,当发生了相应的中断,硬件会自动的将相应的ISR推入一定的寄存器中,

我们软件只要去这个寄存器中执行函数就可以了。


5、S5PV210的中断处理的主要寄存器

5.1、VICnINTENABLE和VICnINTENCLEAR

(1)VICnINTENABLE   这是中断的使能的寄存器,在你想要的中断源置位即可,

VICnINTENCLEAR这个寄存器置1的话,就代表该中断不使能。

5.2、VICnINTSELECT

(1)设置各个中断的模式为IRQ还是FIQ,一般都设置成IRQ

(2)IRQ和FIQ究竟有什么区别:210中支持2种中断,IRQ是普通中断,FIQ是快速中断。

(3)FIQ比IRQ快的地方是在:第一:FIQ有专用的r8-r12,因此在FIQ的ISR中可以直接使用r8-r12

而不用保存,这就能节省时间,

第二:异常向量表FIQ是在最后面,所以中断服务程序就可以直接写在FIQ中断服务入口处。

减少跳转的时间。


5.3、VICnIRQSTATUS和VICnFIQSTATUS

(1)中断状态寄存器,是只读的,当发生中断的时候,该位会置1,表示发生了中断。

当我们执行完中断服务函数的时候,就是靠这个处理中断的第二阶段的第一阶段,

就是靠查询这个寄存器来得到中断编号。


5.4、VICnVECTPRIORITY0~VICnVECTPRIORITY31

中断的优先级的寄存器,可以通过这个寄存器设置中断的优先级,实现中断嵌套。


5.5、VICnVECTADDR0~VICnVECTADDR31、VICnADDR


(1)这三个寄存器和210中断处理第二阶段的第二阶段有关。
(2)VICnVECTADDR0到31这32个寄存器分别用来存放真正的各个中断对应的isr的函数地址。相当于每一个中断源都有一个VECTADDR寄存器,程序员在设置中断的时候,把这个中断的isr地址直接放入这个中断对应的VECTADDR寄存器即可。
(3)VICnADDR这个寄存器是只需要读的,它里面的内容是由硬件自动设置的。当发生了相应中断时,硬件会自动识别中断编号,并且会自动找到这个中断的VECTADDR寄存器,然后将其读出复制到VICnADDR中,供我们使用。这样的设计避免了软件查找中断源和isr,节省了时间,提高了210的中断响应速度。


总结:

整个中断的流程分析:

第一部分:我们为中断响应而坐的预备工作:

1、初始化中断控制器

2、绑定写好的ISR到中断控制器

3、相应中断的所有条件使能

第二部分:当硬件产生中断后如何自动执行ISR

1、经过异常向量表跳转到IRQ、FIQ的入口

2、做中断现场保护(start.s),然后跳入ISR_handler

3、在ISR_handler中确定是哪一个中断,然后直接去这个VIC的ADDR

寄存器中取ISR来执行即可。

4、ISR执行完,中断现场恢复,直接返回继续做常规任务。













  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值