具有基于级别的中断有什么意义?

电器工程 微控制器 中断
2022-01-09 02:02:22

无论我在哪里搜索有关基于级别的中断的实际实现,我都发现只有一个人们给出的建议,即一旦中断进入ISR就禁用它,这样它就不会继续触发。

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

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

那么,在理解电平边缘中断时,我有什么遗漏吗?

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

4个回答

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

当使用基于级别的中断时,中断处理程序可以简单地依次询问每个可能的中断源“您需要注意吗”,如果需要,则为其提供服务。完成后,处理程序可以返回。如果在序列早期轮询的中断源决定在服务后续源时需要注意,处理器将注意到 IRQ 引脚仍处于活动状态并重新触发中断处理程序,从而允许延迟到达的中断得到服务。

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

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

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

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

信号:“Case_Over_Temperature” 当箱内环境温度过高而无法正常运行时,信号变低。

显然,这个信号可能随时变低,要么是因为我们产生了太多的热量,要么是因为盒子安装在一个炎热的地方。

显然,在上电时,该线路可能处于任何一种情况。让我们暂时假设上电代码不只是查看,而是依赖于中断。如果中断是边沿触发且信号已经为低电平,则当中断被启用时,将不会执行相应的代码。电平敏感中断在这里是谨慎的。

类似地,如果处理器进入睡眠状态并且未设置为在该中断上唤醒,则该线路可以随时变为低电平。当任何其他唤醒它的事情发生时,您希望在那个时候触发中断。

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

然而,与所有与代码相关的事物一样,“给猫剥皮”的方法总是不止一种。如果您不使用基于级别,唤醒代码需要去轮询中断引脚,如果它们没有被处理器自动排队。

显然,级别触发也伴随着它自己的一系列问题,即代码必须处理知道它已经处理了条件等。

有点相反:当您可以更容易地触发电平触发时,为什么还要使用尴尬的边缘触发中断?

边沿触发的中断更容易受到噪声尖峰的影响并且更难过滤。然后,他们在场外或向上运行电缆的风险更大。中断不能被源撤回。

电平触发的中断一直保持,直到 CPU 确认源。所以有充分握手的坚实基础。CPU 几乎可以以任何它想要的方式从中断信号中滤除噪声,它只是增加了中断响应时间。如果应用需要并允许经过良好过滤的信号,则可以采用电平触发。

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

当然,答案是它们都有各自的应用程序。但是水平触发是起点,边缘触发是因为有一种特殊情况。

基于级别的 ISR 支持 Ack/Nak,这在您有很多来源时很有用。

如果您在 SW 和外部 HW 中有许多 ISR 和许多优先级,并且具有排序的优先级。

如果所有源都是边缘或,您仍然需要轮询每个源以找到哪个源集,然后清除中断。

所以edge和level在不同的架构中都有优势。

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

某些级别的 IRQ 的持续时间可能比 ISR 长,并且在预期的情况下会被检测到。