我想知道使用ticker
中断是否会干扰按下按钮触发的硬件中断。
想象一下,我想使用这两种类型的中断:
ticker
计时器,每隔n
秒更新小显示屏上的进度条hardware interrupt
,用于启动/停止当用户按下按钮时显示进度的进程 重要提示:两个中断都设置了共享的全局volatile
标记。
在按钮引发的中断期间ticker
中断是否可能发生,并且程序最终会在全局标志设置为矛盾的情况下结束?
硬件和软件中断是否具有相同的排名'?
如果它们同时发生,中断请求稍后发生(但仍然与第一个重叠)会被忽略,还是只是放入队列并在第一个中断完成后直接执行?在这种情况下,标志将以意外的方式设置。
我可以在其他类型的ISR中禁用一种类型的中断 - 即忽略它吗?
即使没有代码示例,我希望问题陈述足够清楚。
答案 0 :(得分:1)
我假设你正在使用AVR。
当中断触发时,在中断例程运行时禁用其他中断。因此,此时发生的任何中断都会被标记。当中断例程返回时,全局中断标志被重新启用,然后任何轮询的中断都可以一次触发。
您可以在例程中为必须运行的关键事项手动启用全局中断,但默认情况下禁用。
修改强>
有没有办法禁用此标志设置?按下按钮后,我不希望自动收报机定时器执行中断。这就是为什么我询问排名和禁用中断类型的能力,如果有这样的事情
您可以清除待处理的中断,但是您必须阅读Arduino AVR的数据表。您需要找到外部中断的寄存器。
例如,在atmega328p上,可以通过将其标志位设置为1来清除外部中断0:
EIFR |= (1 << INTF2);
EIFR
=外部中断标志寄存器
INTF2
=位0 - INTF0:外部中断标志0
但是,轮询loop()
功能中的按钮可能要简单得多。或者最多只需设置一个标志,让您在loop()
函数中执行操作。在那里,您可以决定是否要对中断作出反应或忽略
存在让你的中断太大的问题。如果您使用计时或要求准确性,这可能会随着时间的推移而受到大量影响。由于中断队列长度仅为1深,因此可能会丢失一些中断。以及millis()
&amp; micros()
每毫秒运行多次,因此笨重的中断可能会减慢时间。
你还有任何去抖动代码或硬件吗?
如果没有,处理按钮的中断可以在一次按下多次运行。