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仍然以这种方式进行干预。