6

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

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

谢谢

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

4

2 回答 2

8

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

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

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

这是一个相关的报价:

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

于 2013-08-08T17:58:46.180 回答
0

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

另一方面,在我编写的 2 个中,用于软件中断的ISR是专门用于检测和处理重入活动的。

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

于 2013-08-08T18:27:12.417 回答