使用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?
答案 0 :(得分:2)
如果对计数器进行采样而不是重置,则不会出现任何计时问题。发送期间发生的增量将在下一次迭代中说明。计数器变量的无符号数据类型将确保定义良好的溢出行为。
pexelsClient.getPopularPhotos(10, 1)
.then((result) => {
console.log(this.count)
}