gpt4 book ai didi

c++ - 自动收报机中断会干扰硬件中断吗?

转载 作者:行者123 更新时间:2023-11-30 05:19:01 26 4
gpt4 key购买 nike

背景

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

例子

假设我想使用这两种类型的中断:

  1. ticker 计时器每 n 秒更新一次小显示器上的进度条
  2. 一个硬件中断,它启动/停止进程,如果用户按下一个按钮,进程就会显示出来

重要提示:两个中断都设置了共享的全局volatile 标志。

主要问题

ticker 中断是否有可能在按钮引发的中断期间发生,结果程序以全局标志为设置矛盾?

更具体的问题

硬件和软件中断是否具有相同的“级别”?

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

我能否在另一种类型的 ISR 中禁用一种类型的中断 - 即忽略它?

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

最佳答案

我假设您使用的是 AVR。

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

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

编辑:

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 上,外部中断 0 可以通过将其标志位设置为 1 来清除:

EIFR |= (1 << INTF2);

EIFR = 外部中断标志寄存器
INTF2 = Bit 0 – INTF0:‖外部中断标志 0

但是,轮询 loop() 中的按钮可能要简单得多。功能。或者充其量,只需设置一个标志,让您在 loop() 中采取行动功能。在那里你可以决定是否要对中断使用react或忽略

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

您还有去抖代码或硬件吗?

否则,处理按钮的中断可以在一次按下时运行多次。

关于c++ - 自动收报机中断会干扰硬件中断吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41361450/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com