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