【转】14.5.6 禁止和激活中断线

原文网址:http://book.51cto.com/art/201311/418637.htm

14.5.6  禁止和激活中断线

在上一节中讨论的几个宏只能禁止和激活处理器上所有的中断。但在某种情况下,只需要禁止或激活一条特定的中断线。这就需要使用本节讨论的一些函数。禁止和激活特定中断线的函数如下:

  1. void disable_irq(unsigned int irq);  
  2. void disable_irq_nosync(unsigned int irq);  
  3. void enable_irq(unsigned int irq);  
  4. 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函数的代码如下:
 

    1. void disable_irq(unsigned int irq)  
    2. {  
    3. struct irqdesc *desc = irq_desc + irq;  
    4. disable_irq_nosync(irq);  
    5. if (desc->action)  
    6. synchronize_irq(irq);  
    7. }  
原文地址:https://www.cnblogs.com/wi100sh/p/4875063.html