原文网址:http://book.51cto.com/art/201311/418637.htm
14.5.6 禁止和激活中断线
在上一节中讨论的几个宏只能禁止和激活处理器上所有的中断。但在某种情况下,只需要禁止或激活一条特定的中断线。这就需要使用本节讨论的一些函数。禁止和激活特定中断线的函数如下:
- void disable_irq(unsigned int irq);
- void disable_irq_nosync(unsigned int irq);
- void enable_irq(unsigned int irq);
- void synchronize_irq(unsigned int irq);
其中disable_irq和disable_irq_nosync函数都用于禁止中断控制器上指定的中断线,也就是说禁止了指定中断(irq)向系统中所有处理器的传递。这两个函数的区别是disable_irq函数只有在当前正在执行的所有处理程序完成后才会返回,而disable_irq_nosync函数会立即返回(不管当前是否还有没执行完的处理程序)。
enable_irq函数用于激活中断控制器上指定的中断线。synchronize_irq函数用于等待一个特定的中断线上所有的处理程序都执行完。如果特定中断线上有一个处理程序还没执行完,synchronize_irq函数会一直阻塞。实际上disable_irq函数就是依靠disable_irq_nosync和synchronize_irq函数共同来实现的。首先会调用disable_irq_nosync函数禁止特定中断线。然后根据irqdesc.action判断中断线上是否还有处理程序在执行。irqdesc.action是一个指针,用于指向中断线上处理函数指针的链表的第一项。如果irqdesc.action为0,表明该链表为空,也就表明中断线上的处理程序都执行完了。disable_irq函数的代码如下:
- void disable_irq(unsigned int irq)
- {
- struct irqdesc *desc = irq_desc + irq;
- disable_irq_nosync(irq);
- if (desc->action)
- synchronize_irq(irq);
- }