关于arm中的中断处理
1.cpu内部的中断控制器收集外部各个中断,经过一个的处理以后在报给cpu
2.然后cpu保存现场,调用中断服务程序(ISR)
3.用ISR去识别相应的中断,然后调用相应的中断处理程序
4.处理完以后就进行清除中断
5.恢复被中断的程序
这就是中断处理的流程,下面是对第一步的过程进行详细的介绍。
根据2440手册上的介绍,把这一部分用一副图进行描述
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/316753_1_0.jpg)
request sources:中断请求源.
这里的中断请求源被分成了2个不同的类型,一个是有子中断(with sub-register),一个是没有子中断的,从图中可以得知不同的类型在中断的处理过程也是不一样的。
1.with sub-register 的处理过程
SUBSRCPND
这个寄存器的每一位都对应着一个子中断源,如果出现相应的中断,则会将相应的位置位为"1",如果要清除这个中断,则向相应位置"1"就可以(我也很不明白,不过手册上是这么写的)
SUBMASK
这个寄存器的作用是如果对应位是1则就屏蔽这个中断,如果是0的话就允许这个中断往上去
SRCPND
这个寄存器与SUBSRCPND这个寄存器的作用差不多,不过区别在于是SUBSRCPND是指示子中断,而SRCPND则是用来指示某一类的中断,可以说是一大类的。
MASK
这个也有寄存器的,就是INTMASK 这个寄存器的作用其实和SUMMASK的作用差不多,也是用来屏蔽SRCPND上报的几个中断,不过不一样的是,如果中断是FIQ的话是不可屏蔽的,RIQ是可以屏蔽的
MODE
这个寄存器是INTMODE,这个寄存器很简单的,他是用来对应SRCPND中的中断的,如果某一位置为”1“的话,那就说明这个中断是FIQ的,那cpu就会立即进入FIQ模式的,不过这个通常是用在紧急的中断的.从图中也可以看出来这个关系
Priority(优先级)
不可能每一次都只有一个中断会出现,所以对于多中断出来的时候应该怎么处理....
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/316753_1_1.jpg)
这就是arm的中断仲裁器
总共有7个仲裁器,每一个仲裁器都可以处理6个中断源(REQ0,REQ1,REQ2,REQ3,REQ4,REQ5)
那关于优先级又是怎么区别的?
Each arbiter can handle sixinterruptrequests based on the one bit arbiter mode control (ARB_MODE) and two
bits of selection control signals (ARB_SEL) as follows:
If ARB_SEL bits are 00b, the priority order is REQ0, REQ1, REQ2, REQ3, REQ4, and REQ5.
If ARB_SEL bits are 01b, the priority order is REQ0, REQ2, REQ3, REQ4, REQ1, and REQ5.
If ARB_SEL bits are 10b, the priority order is REQ0, REQ3, REQ4, REQ1, REQ2, and REQ5.
If ARB_SEL bits are 11b, the priority order is REQ0, REQ4, REQ1, REQ2, REQ3, and REQ5.
Note that REQ0 of an arbiter always has the highest priority, and REQ5 has the lowest one. In addition, by
changing the ARB_SEL bits, we can rotate the priority of REQ1 to REQ4.
Here, if ARB_MODE bit is set to 0, ARB_SEL bits doesn’t change automatically changed, making the arbiter to
operate in the fixed priority mode (note that even in this mode, we can reconfigure the priority by manually
changing the ARB_SEL bits). On the other hand, if ARB_MODE bit is 1, ARB_SEL bits are changed in rotation
fashion, e.g., if REQ1 is serviced, ARB_SEL bits are changed to 01b automatically so as to put REQ1 into the
lowest priority. The detailedrules of ARB_SEL change are as follows:
If REQ0 or REQ5 is serviced, ARB_SEL bits are not changed at all.
If REQ1 is serviced, ARB_SEL bits are changed to 01b.
If REQ2 is serviced, ARB_SEL bits are changed to 10b.
If REQ3 is serviced, ARB_SEL bits are changed to 11b.
If REQ4 is serviced, ARB_SEL bits are changed to 00b.
每一个仲裁器可以处理6个中断请求,这些仲裁器是基于1位的(ARB_MODE)和2位的(ARB_SEL)
如果ARB_SEL是00,那么优先级就是REQ0, REQ1, REQ2, REQ3, REQ4, and REQ5.
下面依次类推
不过我们发现REQ0 和REQ5是优先级最高和最低是不变的。
关键是ARB_MODE这个值是有什么用的,关于这个值的主要的作用是优先级是否会自动变化,如果ARB_MODE是0的话,那么这个优先级的不会自动变化的,优先级是你一开始自己要设定要的,如果是1的话,那么这个优先级是会自动变化的,这个变化是循环的,让ARB_SEL循环变化的
规则:
如果是REQ0 或者是REQ5的话,那么ARB_SEL则不变化
如果是REQ1服务,那么ARB_SEL就会变成01,就这样依次继续。对于这个在寄存器PRIORITY这个寄存器中设置。
INTPND 这个是经过来了中断优先级仲裁器优先级选定过以后的中断,让这个寄存器是用来标识这个中断的,这样cpu就可以知道有什么中断了。不过这个寄存器很特殊就是同一个时间它只能一个位为1...
评论