中断处理程序是否必须是可重入的?

时间:2013-08-08 17:44:07

标签: c interrupt interrupt-handling reentrancy

我在中断处理程序中使用静态变量,使中断处理程序不可重入。

  1. 拥有一个不可重入的中断处理程序是否可以?
  2. 当引发硬件中断时,事件是否进入某种队列并等待当前中断处理程序调用完成或是否立即调用中断处理程序?
  3. 由于

    PS。我正在使用Linux。我正在使用的编程语言是C,如果它有所作为。

2 个答案:

答案 0 :(得分:8)

简短的回答是,中断服务例程本身并不需要是可重入的。只有在nested interrupts的情况下才需要重入。如果您使用的操作系统不支持nested interrupts,那么您根本不需要担心重入。如果是这样,您可以控制重置正在服务的中断,以便永远不会得到嵌套中断。

编辑:既然我知道您使用的是Linux,那么您可能会发现此链接很有用:Can an interrupt handler be preempted by the same interrupt handler?

基本上你的问题的答案是Linux在断言时屏蔽中断,这样除非在注册ISR时传递特定标志,否则它不会抢占自身。

这是一个相关的引用:

  

Linux中的中断处理程序不需要是可重入的。当给定   中断处理程序正在执行,相应的中断线是   在所有处理器上屏蔽掉,防止同一个中断   被收到的一行。通常所有其他中断都已启用,   所以其他中断服务,但当前行始终   禁用。因此,永远不会调用相同的中断处理程序   同时服务嵌套中断。这大大简化了   写你的中断处理程序。

答案 1 :(得分:0)

不能代表所有的中断处理程序,但是在十几个平台上我编写了一个硬件中断服务程序(ISR),其机制就是普遍阻止重入行为。

另一方面,软件的ISR中断了我写的2,故意用于检测和处理可重入活动。

如其他地方所述,这可能取决于操作系统/平台。