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

时间:2016-12-28 11:46:16

标签: c++ arduino interrupt ticker

背景

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

实施例

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

  1. ticker计时器,每隔n秒更新小显示屏上的进度条
  2. 一个hardware interrupt,用于启动/停止当用户按下按钮时显示进度的进程
  3. 重要提示:两个中断都设置了共享的全局volatile标记。

    主要问题

    在按钮引发的中断期间ticker中断是否可能发生,并且程序最终会在全局标志设置为矛盾的情况下结束?

    更具体的问题

    硬件和软件中断是否具有相同的排名'?

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

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

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

1 个答案:

答案 0 :(得分:1)

我假设你正在使用AVR。

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

您可以在例程中为必须运行的关键事项手动启用全局中断,但默认情况下禁用。

修改

  

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

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

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

EIFR |= (1 << INTF2);

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

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

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

你还有任何去抖动代码或硬件吗?

如果没有,处理按钮的中断可以在一次按下多次运行。