使用 C 的定时器代码中的空循环含义
Empty loop meaning in a timer code using C
void Tmr_Wait1us (uint16_t delay) {
uint16_t i;
TCNT0 = 0; // will start to count from 0 up to 255 (if 8-bit timer)
for (i = 0; i < delay / 256; i++)
while (TCNT0 < 255)
;
while (TCNT0 <= delay % 256)
;
}
此代码用于设置计时器以等待精确的时间量,以应用于 AVR-Atmega32a,我不明白这里的空循环是做什么的?还有第二个循环是做什么的?
他们看起来像是在忙着等待。他们阻塞直到满足条件。
TCNT0
是定时器 0(一个 8 位定时器)的当前定时器计数。由于它与您的代码异步计数,因此即使 CPU 处于自旋等待状态,它也会递增。
但由于 avr-libc 在 util/delay.h
中提供了相当精确的自旋等待,因此您通常最好改用它们。
for (int i = 0; i < delay; i++)
_delay_us(1);
产生的延迟量取决于为定时器 0 设置的源时钟的预分频器
两个循环都只是阻塞,直到 TCNT0 计数达到特定值
然而,这不是实现延迟循环的好方法
用户不应计算 TCNT0 达到 255 时的点数,而应检查 TIFR 寄存器中的溢出位 TOV0 是否已设置。
您可以参考 atmel 关于 Mega 定时器的应用说明 http://www.atmel.com/Images/Atmel-2505-Setup-and-Use-of-AVR-Timers_ApplicationNote_AVR130.pdf
void Tmr_Wait1us (uint16_t delay) {
uint16_t i;
TCNT0 = 0; // will start to count from 0 up to 255 (if 8-bit timer)
for (i = 0; i < delay / 256; i++)
while (TCNT0 < 255)
;
while (TCNT0 <= delay % 256)
;
}
此代码用于设置计时器以等待精确的时间量,以应用于 AVR-Atmega32a,我不明白这里的空循环是做什么的?还有第二个循环是做什么的?
他们看起来像是在忙着等待。他们阻塞直到满足条件。
TCNT0
是定时器 0(一个 8 位定时器)的当前定时器计数。由于它与您的代码异步计数,因此即使 CPU 处于自旋等待状态,它也会递增。
但由于 avr-libc 在 util/delay.h
中提供了相当精确的自旋等待,因此您通常最好改用它们。
for (int i = 0; i < delay; i++)
_delay_us(1);
产生的延迟量取决于为定时器 0 设置的源时钟的预分频器 两个循环都只是阻塞,直到 TCNT0 计数达到特定值 然而,这不是实现延迟循环的好方法 用户不应计算 TCNT0 达到 255 时的点数,而应检查 TIFR 寄存器中的溢出位 TOV0 是否已设置。 您可以参考 atmel 关于 Mega 定时器的应用说明 http://www.atmel.com/Images/Atmel-2505-Setup-and-Use-of-AVR-Timers_ApplicationNote_AVR130.pdf