AVR中断的变量已在main中更新

时间:2018-12-08 09:37:38

标签: c interrupt avr isr

使用8位AVR微型计算机,我遇到了一个可能不太容易解决的简单情况。

请考虑以下代码段:

static volatile uint8_t counter;

//fires often and I need all the values of the counter.
void isr(void) {
  counter++;
}

int main (void) {

  while(1) {
    send_uart(counter);
    counter = 0;
    delay_ms(1000); //1 sec pause
  }  

  return 0;
}

1。)可能发生的情况是,send_uart之后是一个isr,它会增加计数器,然后下一条语句将其清零。 因此,我会从计数器中丢失一个数据。

2。)如果我在主fn中使用ATOMIC_BLOCK(ATOMIC_RESTORESTATE),则可以避免在(1)中声明的问题,但是由于我在短时间内禁用了INT,因此可能错过了一个ISR。

是否有更好的方法将信息从主fn传递给ISR?

1 个答案:

答案 0 :(得分:2)

如果对计数器进行采样而不是重置,则不会出现任何计时问题。发送期间发生的增量将在下一次迭代中说明。计数器变量的无符号数据类型将确保定义良好的溢出行为。

pexelsClient.getPopularPhotos(10, 1)
    .then((result) => {
    console.log(this.count) 
}