自动收报机中断会干扰硬件中断吗?
Could ticker interrupts interfere with hardware interrupts?
背景
我想知道使用 ticker
中断是否会干扰按下按钮触发的硬件中断。
例子
假设我想使用这两种类型的中断:
- 一个
ticker
计时器每 n
秒更新一个小显示器上的进度条
- a
hardware interrupt
表示 starts/stops 如果用户按下按钮则显示其进度的进程
重要提示:两个中断都设置共享全局 volatile
标志。
主要问题
是否有可能 ticker
中断在 期间 按钮引起的中断发生,结果程序以全局状态结束标志设置自相矛盾?
更具体的问题
硬件和软件中断是否相同'rank'?
如果它们同时发生,会忽略稍晚发生的中断请求(但仍与第一个中断请求重叠),还是直接放入队列并在第一个中断完成后直接执行?在这种情况下,标志将以意想不到的方式设置。
我可以在另一种类型的 ISR 中禁用一种类型的中断 - 即忽略它吗?
即使没有代码示例,我也希望问题陈述足够清楚。
我假设您使用的是 AVR。
当一个中断触发时,其他中断在中断例程 运行ning 时被禁用。因此,此时发生的任何中断都会被标记出来。当中断例程 returns 时,重新启用全局中断标志,然后可以一次触发任何轮询中断。
对于必须运行但默认情况下禁用的关键事情,您可以在例程中手动启用全局中断。
编辑:
Is there a way to disable this flag setting? I don't want the ticker timer to perform an interrupt once the button has been pressed. This is why I asked about ranks and the ability to disable on type of interrupt, if there is such a thing
您可以清除挂起的中断,但是您必须阅读 Arduino 的 AVR 的数据表。您需要找到外部中断的寄存器。
例如,在atmega328p上,可以通过将其标志位设置为1来清除外部中断0:
EIFR |= (1 << INTF2);
EIFR
= 外部中断标志寄存器
INTF2
= Bit 0 – INTF0:‖外部中断标志 0
但是,轮询 loop()
函数中的按钮可能要简单得多。或者至多,只需设置一个标志,让您在 loop()
函数中进行操作。在那里你可以决定是否要对中断做出反应或忽略
存在中断太大的问题。如果您使用计时,或需要准确性,这可能会随着时间的推移而受到很大影响。由于中断队列长度只有 1 深,一些中断可能会丢失。并且每毫秒多次为 millis()
& micros()
运行s 供电的中断,因此庞大的中断最终可能会减慢时间。
还有你有去抖代码或硬件吗?
如果不是,处理按钮的中断可以在一次按下时 运行 多次。
背景
我想知道使用 ticker
中断是否会干扰按下按钮触发的硬件中断。
例子
假设我想使用这两种类型的中断:
- 一个
ticker
计时器每n
秒更新一个小显示器上的进度条 - a
hardware interrupt
表示 starts/stops 如果用户按下按钮则显示其进度的进程
重要提示:两个中断都设置共享全局 volatile
标志。
主要问题
是否有可能 ticker
中断在 期间 按钮引起的中断发生,结果程序以全局状态结束标志设置自相矛盾?
更具体的问题
硬件和软件中断是否相同'rank'?
如果它们同时发生,会忽略稍晚发生的中断请求(但仍与第一个中断请求重叠),还是直接放入队列并在第一个中断完成后直接执行?在这种情况下,标志将以意想不到的方式设置。
我可以在另一种类型的 ISR 中禁用一种类型的中断 - 即忽略它吗?
即使没有代码示例,我也希望问题陈述足够清楚。
我假设您使用的是 AVR。
当一个中断触发时,其他中断在中断例程 运行ning 时被禁用。因此,此时发生的任何中断都会被标记出来。当中断例程 returns 时,重新启用全局中断标志,然后可以一次触发任何轮询中断。
对于必须运行但默认情况下禁用的关键事情,您可以在例程中手动启用全局中断。
编辑:
Is there a way to disable this flag setting? I don't want the ticker timer to perform an interrupt once the button has been pressed. This is why I asked about ranks and the ability to disable on type of interrupt, if there is such a thing
您可以清除挂起的中断,但是您必须阅读 Arduino 的 AVR 的数据表。您需要找到外部中断的寄存器。
例如,在atmega328p上,可以通过将其标志位设置为1来清除外部中断0:
EIFR |= (1 << INTF2);
EIFR
= 外部中断标志寄存器
INTF2
= Bit 0 – INTF0:‖外部中断标志 0
但是,轮询 loop()
函数中的按钮可能要简单得多。或者至多,只需设置一个标志,让您在 loop()
函数中进行操作。在那里你可以决定是否要对中断做出反应或忽略
存在中断太大的问题。如果您使用计时,或需要准确性,这可能会随着时间的推移而受到很大影响。由于中断队列长度只有 1 深,一些中断可能会丢失。并且每毫秒多次为 millis()
& micros()
运行s 供电的中断,因此庞大的中断最终可能会减慢时间。
还有你有去抖代码或硬件吗?
如果不是,处理按钮的中断可以在一次按下时 运行 多次。