C++ 股票代码中断会干扰硬件中断吗? 背景

C++ 股票代码中断会干扰硬件中断吗? 背景,c++,arduino,interrupt,ticker,C++,Arduino,Interrupt,Ticker,我想知道使用ticker中断是否会干扰按键触发的硬件中断 例子 假设我想使用这两种类型的中断: 一个ticker计时器,用于每隔n秒更新小显示屏上的进度条 一种硬件中断,它启动/停止进程,如果用户按下按钮,进程的进度就会显示出来 重要提示:两个中断都设置了共享全局易失性标志 主要问题 在按钮引发的中断过程中,股票行情器中断是否可能发生,从而导致程序最终处于全局标志设置矛盾的状态 更具体的问题 硬件和软件中断是否具有相同的“等级” 如果它们同时发生,是否会忽略稍晚发生的中断请求(但仍与第一个请求重

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

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

  • 一个
    ticker
    计时器,用于每隔
    n
    秒更新小显示屏上的进度条
  • 一种
    硬件中断
    ,它启动/停止进程,如果用户按下按钮,进程的进度就会显示出来
  • 重要提示:两个中断都设置了共享全局
    易失性
    标志

    主要问题 在按钮引发的中断过程中,
    股票行情器
    中断是否可能发生,从而导致程序最终处于全局标志设置矛盾的状态

    更具体的问题 硬件和软件中断是否具有相同的“等级”

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

    我是否可以在另一种类型的ISR中禁用一种类型的中断,即忽略它


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

    我假设您使用的是AVR

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

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

    编辑:

    有没有办法禁用此标志设置?我不想让计时器在按下按钮后执行中断。这就是为什么我问起等级和禁用中断类型的能力,如果有这样的事情的话

    您可以清除挂起的中断,但是您必须阅读Arduino AVR的数据表。您需要找到外部中断的寄存器

    例如,在atmega328p上,可通过将其标志位设置为1清除外部中断0:


    EIFR |=(1)谢谢你的回答。有没有办法禁用此标志设置?我不想在按下按钮后,
    计时器执行中断。这就是为什么我问了关于等级和禁用中断类型的能力,如果有这样的事情…@pfabri我编辑了我的回答来查看上面的问题。Yes、 我做了一个(测试)按钮上的软件去抖动。我理解您的建议,但即使按钮中断除了设置一个全局标志外没有其他作用,如果计时器同时请求一个中断,那么一旦按钮中断退出,计时器中断将从IR队列中拉出来并执行,这反过来将重写全局标志集通过按钮中断。因此,
    loop()
    会认为中断来自计时器。难道我不能在按钮中断中使用
    noInterrupts()
    忽略计时器IRs吗?这就是我所需要的。@pfabri“因此,loop()会认为中断来自计时器”--我说的是一个简单的
    bool
    值,它不需要被定时器ISR触及。不,
    noInterrupts
    在ISR中不会起任何作用,因为全局中断已经被禁用,中断仍被标记为等待,并且在当前ISR返回后将继续。“是否在按钮中断内忽略计时器IRs?”您可以使用
    易失性bool
    ,然后在按钮ISR中,输入时设置为true,返回时设置为false。然后在计时器ISR中,如果bool为true,则返回,不执行任何操作您可以使用易失性bool,然后在按钮ISR中,输入时设置为true,返回时设置为false。然后在计时器ISR中,如果bool为true,则返回并不执行任何操作。”但这与您前面所说的不矛盾吗?如果计时器IR在队列中等待按钮IR完成,并且如果按钮IR通过设置标志“返回时设置为false”退出“,那么当定时器IR启动时,该标志将始终为假。或者我完全误解了什么?只是问,因为这正是我之前尝试的,但显然,两个IRs仍然以这种方式进行干预。