首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >代码中断会干扰硬件中断吗?

代码中断会干扰硬件中断吗?
EN

Stack Overflow用户
提问于 2016-12-28 11:46:15
回答 1查看 495关注 0票数 1

背景

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

示例

想象一下,我想使用这两种类型的中断:

  1. 一个ticker计时器,用于每秒钟更新一次小显示器上的进度条
  2. 启动/停止进程的hardware interrupt,如果用户按下按钮,进程将显示该进程。

重要:和都设置了共享的全局volatile标志。

主要问题

ticker中断是否有可能在期间发生按钮诱导的中断,从而导致程序处于设置全局标志的矛盾状态?

更具体的问题

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

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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()的中断每毫秒运行多次,因此一个庞大的中断最终可能会减慢时间。

另外,您有任何删除代码或硬件吗?

如果没有,则处理按钮的中断可以在一次按下上运行多次。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41361450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档