具有基于级别的中断的意义何在?


8

无论我在哪里搜索基于级别的中断的实际实现方式,我都发现只有一个建议,即人们已经给出了该中断,即在中断进入ISR后立即将其禁用,这样就不会继续触发它。

我读过的另一件事是,它用于创建循环,即只要存在中断即可为ISR服务,但可以使用whileor do while循环来实现。

级别边缘中断将提供的优势可能是在服务ISR和延迟之间运行主程序的一条指令。我猜。

那么,在理解电平边缘中断时我缺少什么吗?

一个很好的答案是向我展示基于级别的中断的某种实际用法。


...我读过的另一件事是,它用于创建一个循环,即只要存在中断,即可服务于ISR,但这可以用while循环或while循环来实现.... 事实上,有些事情可以实现一种方法,并不意味着我们应该消除所有其他相同的方法。
尤金(Eugene Sh)。

@EugeneSh。毫无疑问,但是以另一种方式做同样的事情必须具有一定的优势。是不是 我对了解“优势”更感兴趣。我只想知道它在使用循环语句和基于级别的中断进行循环时产生什么不同?如果使用循环是唯一的目的。
MaNyYaCk

2
如果一行上有多个待处理的中断怎么办?例如,ISR的每个触发器处理一个数据包,但设备在队列中有多个数据包?对于边沿触发的中断,中断控制器需要知道何时处理上一个中断以及何时提交下一个中断。同样适用于在主机仍在处理前一个中断而没有级别触发的情况下断言多个中断的用例,很难将它们排队并确定优先级。
user3528438

Answers:


10

基于级别的中断可以安全,轻松,可靠地共享和级联;相反,可靠地共享边沿触发的中断通常很困难,有时甚至是不可能的。

使用基于级别的中断时,中断处理程序可以简单地依次询问每个可能的中断源“您是否需要注意”,如果需要,可以对其进行服务。完成后,处理程序可以返回。如果在顺序的较早时间轮询的中断源决定在服务较晚的中断源时需要注意,则处理器将注意到IRQ引脚仍处于活动状态并重新触发中断处理程序,从而允许较晚到达的中断被服务。

当使用非级联的边沿触发中断时,事情变得更加复杂。中断处理程序经过处理并为每个人提供服务后,它必须进行遍历并重新轮询每个人,以查明先前轮询的设备是否已决定需要服务。只有在每个设备连续报告不需要服务之后,中断返回才是安全的。请注意,如果需要服务的设备保持其“需要服务”指示处于活动状态,则在设备需要服务时从中断处理程序返回可能使该中断永久无效。

I / O引脚具有一些边沿捕获逻辑可能很有用,当边沿到达时,该逻辑会设置锁存器并输出“需要服务”指示,直到软件将其清除为止。这样的事情可能会在前端作为边缘敏感的中断出现。但是,在任何下游点,最好让中断逻辑要求在不满足任何上游点的情况下始终服务于中断。


抱歉,我花了很多时间。但是我提出的问题是控制器的外部中断所特有的,我花了一些时间来了解所有涌入的答案,才考虑使用带有中断控制器的处理器。感谢您提供这个宝贵的答案。
MaNyYaCk

6

基于级别的中断有用的一种明显情况是,当代码开始监视信号时,信号已经处于该状态。

让我们考虑一个典型的例子...

信号:“ Case_Over_Temperature”当盒子中的环境温度对于正常操作而言过高时变低。

显然,此信号随时可能变低,这可能是因为我们发热量过多,或者是因为盒子安装在高温的地方。

显然,在加电时,该线路可能处于任一状态。现在,让我们假设上电代码不仅看起来像而是依靠中断。如果中断是边沿触发的并且信号已经为低,则当启用中断时,将不会执行适当的代码。电平敏感的中断在这里是谨慎的。

同样,如果处理器进入睡眠状态且未设置为在该中断时唤醒,则该线随时可能变为低电平。当发生任何其他唤醒时,您希望当时触发该中断。

确实,可以说,随着睡眠模式处理器的普及,基于级别的中断变得更加有用。

但是,与所有与代码相关的事物一样,“皮肤猫”总是有不止一种方法。如果您不使用基于级别的,则唤醒代码需要对中断针进行轮询,如果处理器没有将它们自动排队。

显然,级别触发还带有它自己的一系列问题,因为代码必须知道已经处理了条件等来进行处理。


2

这又是另一回事:为什么您可以进行更简单的电平触发,为什么会有尴尬的边沿触发中断呢?

边沿触发的中断更容易受到噪声尖峰的影响,并且更难以过滤。这样一来,他们冒着跑板外或上电缆的风险。中断不能由源撤回。

电平触发的中断一直持续到CPU确认源为止。因此,有充分的握手基础。CPU几乎可以采用任何所需的方式将噪声从中断信号中滤除,这只是增加了中断响应时间。如果应用需要并允许对信号进行良好滤波,则电平触发是可调整的。

我首先看到用于Z80和6502等CPU上的NMI的边沿触发中断,而可屏蔽中断则使用级别触发。NMI使用边缘触发只是为了阻止卡住的引脚或卡住的驱动电路,以防止CPU永远重新进入NMI ISR。NMI必须显示活动以获得另一个。

答案当然是它们都有自己的应用程序。但是级别触发是起点,而边缘触发则是因为有特殊情况。


1
我不会说Z80和6502使用沿触发的中断来避免“卡死”引脚的问题。相反,我要说的是,一旦服务开始,他们就必须能够屏蔽任何类型的中断,对于NMI,这是通过特殊的“ mask NMI”锁存器来实现的,该锁存器在服务NMI时置位,并在处理NMI时清除。 NMI引脚被释放。
超级猫

@supercat,您描述的是它的外观,但没有描述Z80 / 6502的工作方式。NMI可以是与INT / IRQ相同的级别,并且可以通过硬件或软件中断确认删除中断源。效果很好。您认为使他们将NMI设计为边沿触发而将INT / IRQ设计为水平的是什么,您认为这有什么好处?
TonyM '17

术语“边沿触发”用于描述将边沿检测电路放置在同步器之前的输入,以便在单个周期内来回传递的信号将得到处理,但是我也已经看到它用来描述输入它在每个时钟信号上锁存一个信号,并寻找一个或多个周期不存在的信号,然后存在一个或多个周期。如果必须通过软件确认NMI,则未能确认第一个中断将有效地掩盖所有后续中断。
超级猫

@supercat,这不是Z80 / 6502的工作方式,仅它们是您所质疑的我的示例的主题。如果您正在讨论边缘触发的NMI,请进行聊天以避免扩展评论交换。不过,不确定我可以添加什么。谢谢。
TonyM '17

我没有研究Z80工作原理的细节,但是根据6502数据表,NMI在每个phi2时钟上采样一次。数据表没有说明采样/保持时间,但是根据我在其他地方读到的内容,在至少三个连续采样期间不存在的NMI脉冲将不会始终被处理。
超级猫

1

基于级别的ISR支持Ack / Nak,当您有许多来源时,此功能很有用。

如果您在软件和外部硬件中都有许多ISR和许多优先级,并具有优先级。

如果所有源都是边沿“或”,则仍然必须轮询每个源以找到哪个源集,然后清除中断。

因此,边缘和级别在不同的体系结构中都具有优势。

为避免丢失边缘IRQ,必须启用它,然后在ISR结束后立即对其进行测试。

某些级别的IRQ可以比ISR持续更长的时间,并且可以预期地被检测到。


1

当使用“共线”以及漏极开路或集电极开路时,电平操作模式更有意义。

在这种情况下,该行上的每个“参与方”在需要“服务”时都会激活其输出。当中断处理软件退出并依次轮询(然后处理)聚会线路上的每个设备时,这些设备将释放其保持状态并变为非活动状态。最终,不再有其他(级别)中断,中断线本身变为非活动状态,并且处理中断的软件再次变为“静态”。


1
这非常重要。如果主机已经在处理中断,又在另一条线上收到另一个边沿,该怎么办?几种选择:1)忽略传入的中断;2)在硬件中排队;3)中断当前的中断处理程序并处理新的中断处理程序,或者完全处理它,或者将其排队等待以后使用。使用电平触发时,您只需将其留在那里,在完成当前ISR之后,它将仍然在那里供您处理。
user3528438

@ user3528438我正在解决有关“为什么级别”的问题。因此,我将删除该部分并避免辩论。
jonk

1
即使使用专用中断,我还是建议边沿触发的中断只有在人们可能希望响应一个可以服务的事件时才响应,甚至在那里使用事件锁存,才是更好的选择驱动电平敏感中断的设备可能与使用边缘敏感中断一样有用。边沿触发的中断可能会保存一条指令,否则将需要清除一条锁存器,但这通常不是有意义的成本或节省。
超级猫

@supercat我将回答的重点重新放在直接回答标题的问题上,以避免参加冗长而肮脏的章节。简单得多。(是的,自1974年以来,我一直在使用各种方式的中断方法,所以我想我已经看到了所有原因。我只是不想今天讨论它们。)
星期一
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.