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