特定中断掩码的清除是否会在清除时推迟或忽略中断?

时间:2012-11-25 15:27:21

标签: arduino interrupt avr

我在Arduino(Avr)中有一段代码我想执行它而不会被中断所打断,该中断也对这段代码中使用的变量进行操作。我不希望在执行代码时丢失该中断;相反,我想暂停中断很短的时间。我只想推迟这一个中断,而不是所有中断。

现在我正在清除该中断屏蔽并在代码完成后重新设置。这管用吗?这就是代码的样子:

这段代码我不想被那个中断打断(在这种情况下是timer1溢出中断):

  TIMSK1 = 0; //Set Timer1 Mask off. Just postponed ???? I hope so.
  int c = buffer[reading_pointer]; 
  reading_pointer = (reading_pointer + 1)%SIZE_OF_BUFFER;
  something_on_buffer = false;
  //buffer and something_on_buffer are set on Timer1 interrupt. 
  TIMSK1 |= (1 << TOIE1); //Enable timer1 again.
在Timer1上也设置了

something_on_bufferbuffer,如果中断在读取缓冲区并在此段代码中设置something_on_buffer时执行,则会发生冲突,并且这就是我想为这几行代码推迟Timer1中断的原因。只是要确定。这该怎么做?这是正确的方法吗?

1 个答案:

答案 0 :(得分:0)

你的方法看起来很好。

通常,处理器具有用于中断的标志寄存器,以及用于启用中断的寄存器。在每一步,处理器检查标志和标志并启用位以查看它是否应该运行中断。也就是说,只有当设置标志触发中断运行时,使能位才会控制是否设置标志。

如果通过设置该位来启用中断并且标志已经设置,则在下一个机器指令之前运行中断。

如果未使能中断,则仍可通过条件设置标志位。