02.07.2013 Views

kernel 里面的中断代码分析

kernel 里面的中断代码分析

kernel 里面的中断代码分析

SHOW MORE
SHOW LESS

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的部分

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!