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

Will a new interrupt while in function with nointerrupts() be queued and executed after interrupts()?

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

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

会在interrupts()之后执行吗?

我问这个是因为看了datasheet,感觉所有的中断都有自己的flag,所以这个应该没问题。但我不是那么有经验,而且我可能遗漏了一些东西,因为其他教程总是含糊地说 "don't stay there too long, since no interrupts at all may happen at that time".

为什么?

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

此外,我在相反方向使用相同的缓冲区class(但实例不同)(I2C 然后触发中断并读取)。

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

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

谢谢。

你的做法看起来很正常。您需要禁用中断以保护缓冲区。

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

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