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()
一起工作。
谢谢。
您的方法似乎很正常。您需要禁用中断来保护缓冲区。
当中断被禁用时,将继续设置中断标志,但不会调用处理程序。当启用中断时,中断处理程序将运行。
禁用中断时不要花费太长时间的警告是,禁用时可能会触发两个相同类型的中断。如果发生这种情况,单个中断标志将被设置一次,并且无法判断有两个中断挂起。中断处理程序只运行一次。从本质上讲,第一个中断是丢失的。