在函数中使用nointerrupts()时,一个新的中断会被排队并在中断()之后执行吗



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触发并覆盖我当前从正常主循环读取的项目时,我不会处于这种情况。

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

谢谢。

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

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

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

最新更新