在执行nointerrupts()函数时,新的中断是否会在中断()之后排队并执行?

时间:2017-01-02 19:25:38

标签: arduino avr

AVR MCU(Arduino)会记住在nointerrupts()部分发生的所有中断吗?

void f1() {
  noInterrupts();
  // critical, time-sensitive code here
  interrupts();
}
//now jump to queued interrupts if any

它会在interrupts()之后执行吗?

我问这个是因为在阅读了数据表之后,我觉得所有的中断都有它们的标志,所以这可能没问题。但我不是那么有经验,而且我可能会遗漏一些东西,因为其他教程总是模糊地说“不要在那里停留太长时间,因为当时根本不会发生中断”。

为什么?

我有一个循环缓冲区,我从I2C中放入了一些数据包(只要发生I2C中断,它们就会被放置)。我也偶尔在主循环中读取这个缓冲区,在不可预测的时间允许覆盖。

另外,我在相反的方向使用相同的缓冲类(但是不同的实例)(I2C然后触发中断和读取)。

我的问题是:我想在非中断读/写期间关闭中断,所以我可以确定我不会遇到I2C触发并覆盖当前从正常主循环读取的项目的情况。

我现在在读取之前和之后处理带有标志的情况,所以中断首先检查项目是否空闲,但我对这种方法没有信心,我想让它与{{1在主循环读取期间和} noInterrupts()

谢谢。

1 个答案:

答案 0 :(得分:6)

你的方法似乎正常。您需要禁用中断来保护缓冲区。

禁用中断时,将继续设置中断标志,但不会调用处理程序。启用中断后,中断处理程序将运行。

禁用中断时不要花太长时间的警告是禁用时可以触发两种相同类型的中断。如果发生这种情况,单个中断标志被设置一次,并且无法确定有两个待处理的中断。中断处理程序只运行一次。基本上,第一个中断丢失了。