AVR MCU(Arduino)会记住nointerrupts()部分中发生的所有中断吗?
void f1() {
noInterrupts();
// critical, time-sensitive code here
interrupts();
}
//now jump to queued interrupts if any
Run Code Online (Sandbox Code Playgroud)
它会在之后执行interrupts()吗?
我问这个是因为在阅读了数据表之后,我觉得所有的中断都有它们的标志,所以这可能没问题.但我不是那么经验丰富,我可能会遗漏一些东西,因为其他教程总是模糊地说"不要在那里停留太长时间,因为当时根本不会发生中断".
为什么?
我有一个循环缓冲区,我从I2C中放入一些数据包(只要发生I2C中断,它们就被放置).我也偶尔在主循环中读取这个缓冲区,在不可预测的时间允许覆盖.
另外,我在相反的方向上使用相同的缓冲类(但是不同的实例)(I2C然后触发中断和读取).
我的问题是:我想在非中断读/写期间关闭中断,所以我可以确定我不会遇到I2C触发并覆盖当前从正常主循环读取的项目的情况.
我现在有种处理与前和读取后标志的情况,因此中断首先检查的项目是免费的,但我不是这种方法有信心,我想,使其与工作noInterrupts()和interrupts()阅读主循环中.
谢谢.
你的方法似乎正常.您需要禁用中断以保护缓冲区.
禁用中断时,将继续设置中断标志,但不会调用处理程序.启用中断后,中断处理程序将运行.
禁用中断不会花费太长时间的警告是在禁用时可以触发两种相同类型的中断.如果发生这种情况,单个中断标志被设置一次,并且无法确定有两个待处理的中断.中断处理程序只运行一次.基本上,第一个中断丢失了.