kernel 里面的中断代码分析
kernel 里面的中断代码分析
kernel 里面的中断代码分析
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
1> 就是 当硬件出发了中断,<br />
2> SRCPND对应的bit自动置1 ,<br />
3> INTMASK 要分两种情况:<br />
如果INTMASK对应的bit是1 , 那么INTPND对应的bit就不会自动置1 ,表示 中断控制器肯定不会request IRQ to CPU 。<br />
如果INTMASK对应的bit是0 , 那么INTPND对应的bit就 会自动置1 , 那么中断控制器 会 request IRQ to CPU 。<br />
4> 如果INTPND对应的bit就 被置 1 了, 接下来还要分两种情况:<br />
如果I-bit 是0 , 表示CPU 可以 accept 中断控制器的 IRQ request , 那么CPU 就会执行 中断处理routine 。<br />
如果I-bit 是1 , 表示 CPU 不能 accept 中断控制器的 IRQ request , 就不会调用 中断处理routine<br />
又想到一个比喻: 古代奸臣误国,好多正直大臣的奏折并不能被直接传递到皇帝手中 ,比如大奸臣魏忠贤。<br />
魏忠贤好比是中断控制器 , 皇帝好比是CPU 。<br />
奏章要首先经过魏忠贤的手, 如果魏忠贤屏蔽掉某个大臣的奏章(mask),那么皇帝肯定没有机会看了。<br />
但是假使奏章通过魏忠贤(interrupt controller)传给皇帝了, 可是皇帝是个糊涂蛋, 只知玩乐,误了朝政, 奏折堆积如山(就<br />
相当于 F-bit=1,I-bit=1)了。<br />
所以封建国家, 既要有好大臣(狄仁杰,什么奏章都敢上奏,不管是否是弹劾自己的), 又要有好皇帝(唐太宗,勤于政事)<br />
啊。<br />
当一个中断控制器连接了128个中断源的时候, CPU怎么知道哪个中断源产生<br />
了中断呢?继而调用对应的中断处理函数呢?<br />
一般的原理都是这样的:<br />
显然,要回答这个问题, 必须要搞清楚, CPU是肯定不知道哪个中断源产生了中断的, 谁知道呢?只有中断控制器才知<br />
道的, 那么,CPU就要查询中断控制器就好了。 问题是中断控制器的那个register 的标志bit 被置1 , 肯定是硬件做的,<br />
知道这些就足够了。<br />
当中断源触发了一个中断的时候, 中断控制器要提供一个寄存器来标志哪个源产生中断, 类似2410 就提供INTPND(32<br />
个bit,bit置1 就表示对应的source产生了中断) , 那么CPU就会读取这个寄存器,以确定中断号(get_irqnr_and_base<br />
这是个汇编宏)。 问题在于CPU怎么知道要去读呢? 显然要中断控制器给CPU发一个IRQ的request , 这样CPU才会去读<br />
(实际上是一段汇编代码) 。<br />
继而才会调用asm_do_IRQ(irq_number)来处理中断, 继而可以通过irq号找到对应中断的中断描述符(irq descriptor),找<br />
到了中断描述符,就找到了,handler , 然后 调用 ->handler() 就可以处理中断了。<br />
----------<br />
1.4 外部中断控制器的分析(与GPIO有关)<br />
分析完了中断控制器的部分。<br />
我们还要接下来看看 datasheet的什么部分与中断有关。<br />
就是 P276 页 里面的关于外部中断的部分 ,还有 GPF和GPG的部分