自动收报机中断会干扰硬件中断吗?

Could ticker interrupts interfere with hardware interrupts?

本文关键字:中断 硬件 干扰 收报机      更新时间:2023-10-16

Background

我想知道使用ticker中断是否会干扰按下按钮触发的硬件中断。

想象一下,我想使用这两种类型的中断:

  1. ticker计时器,每n秒更新一次小显示屏上的进度条
  2. 启动/停止进程的hardware interrupt,如果用户按下按钮,则会显示其进度

重要事项:两个中断都设置了共享的全局volatile标志。

主要问题

在按钮诱导中断期间发生ticker中断,并导致程序最终处于全局标志设置矛盾的状态,是否有可能?

更具体的问题

硬件和软件中断是否具有相同的"等级"?

如果它们同时发生,是忽略稍晚发生的中断请求(但仍与第一个中断重叠),还是只是放入队列并在第一个中断完成后直接执行?在这种情况下,将以意外的方式设置标志。

我可以在另一种类型的 ISR 中禁用一种类型的中断 - 即忽略它吗?

我希望即使没有代码示例,问题陈述也足够清晰。

我假设你使用的是AVR。

当中断触发时,在中断例程运行时禁用其他中断。因此,在此期间发生的任何中断都会被标记。当中断例程返回时,将重新启用全局中断标志,然后可以一次触发一个轮询的中断。

您可以手动启用例程中的全局中断,以处理必须运行但默认情况下处于禁用状态的关键内容。

编辑:

有没有办法禁用此标志设置?我不希望自动收报机计时器在按下按钮后执行中断。这就是为什么我问等级和禁用中断类型的能力,如果有这样的事情

您可以清除挂起的中断,但是您必须阅读Arduino的AVR的数据表。您需要找到外部中断的寄存器。

例如,在 atmega328p 上,可以通过将其标志位设置为 1 来清除外部中断 0:

EIFR |= (1 << INTF2);

EIFR

= 外部中断标志寄存器
INTF2= 位 0 – INTF0:外部中断标志 0

但是,在loop()函数中轮询按钮可能要简单得多。或者充其量,只需设置一个标志,让您在loop()函数中执行操作。在那里,您可以决定是否要对中断做出反应或忽略

存在中断太大的问题。如果您使用计时或要求准确性,随着时间的推移,这可能会受到大量影响。由于中断队列长度仅为 1 深度,因此可能会丢失一些中断。为millis()&micros()供电的中断每毫秒运行多次,因此庞大的中断最终可能会减慢时间。

另外,您有任何去抖代码或硬件吗?

否则,处理按钮的中断可以在一次按下时多次运行。