Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C的计时器代码中的空循环含义 void Tmr_Wait1us(uint16_t延迟){ uint16_t i; TCNT0=0;//将从0开始计数到255(如果是8位计时器) 对于(i=0;i_C_Embedded_Avr - Fatal编程技术网

使用C的计时器代码中的空循环含义 void Tmr_Wait1us(uint16_t延迟){ uint16_t i; TCNT0=0;//将从0开始计数到255(如果是8位计时器) 对于(i=0;i

使用C的计时器代码中的空循环含义 void Tmr_Wait1us(uint16_t延迟){ uint16_t i; TCNT0=0;//将从0开始计数到255(如果是8位计时器) 对于(i=0;i,c,embedded,avr,C,Embedded,Avr,它们看起来像忙等待。它们阻塞直到满足条件。它们看起来像忙等待。它们阻塞直到满足条件。TCNT0是计时器0(8位计时器)的当前计时器计数。由于它与代码异步计数,因此即使CPU处于旋转等待状态,它也会递增 但由于avr libc在中提供了相当精确的旋转等待,所以通常最好使用这些 void Tmr_Wait1us (uint16_t delay) { uint16_t i; TCNT0 = 0; // will start to count from 0 up to 255

它们看起来像忙等待。它们阻塞直到满足条件。

它们看起来像忙等待。它们阻塞直到满足条件。

TCNT0
是计时器0(8位计时器)的当前计时器计数。由于它与代码异步计数,因此即使CPU处于旋转等待状态,它也会递增

但由于avr libc在中提供了相当精确的旋转等待,所以通常最好使用这些

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)
        ;
}
for(int i=0;i
TCNT0
是计时器0(一种8位计时器)的当前计时器计数。由于它与代码异步计数,因此即使CPU处于旋转等待状态,它也会递增

但由于avr libc在中提供了相当精确的旋转等待,所以通常最好使用这些

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)
        ;
}
for(int i=0;i
产生的延迟量取决于为计时器0设置的源时钟的预分频 两个循环都会阻塞,直到TCNT0计数达到特定值 但是,这不是实现延迟循环的好方法 当TCNT0达到255时,用户应检查要设置的TIFR寄存器中的溢出位TOV0,而不是计数点。
您可以参考atmel关于Mega定时器的应用说明

产生的延迟量取决于为定时器0设置的源时钟的预标量 两个循环都会阻塞,直到TCNT0计数达到特定值 但是,这不是实现延迟循环的好方法 当TCNT0达到255时,用户应检查要设置的TIFR寄存器中的溢出位TOV0,而不是计数点。
您可以参考atmel关于超级定时器的应用说明

第一个
延迟/256
循环计数直到
TCNT0
等于255。最后一个循环计数剩余的
延迟%256
。如果定时器在循环测试之间滚动,代码将失败。第一个
延迟/256
循环计数直到
TCNT0
相等ls 255。最后一个循环计数剩余的
延迟%256
。如果计时器在循环测试之间滚动,则代码将失败。问题不明确;有三个循环,其中两个为空。请清楚您所指的是哪些循环。这不是一个好的延迟方法;8位计时器将从255换行到零,但循环将在
TCNT0<255
,只有当
TCNT0
正好为255时才为假,如果中断发生且处理时间长于单个计数,则很容易错过此状态,使延迟非确定性地长于预期时间。相反,应使用计时器换行中断增加计数器,并且该计数器轮询ra而不是
TCNT0
。问题不明确;有三个循环,其中两个是空的。请明确您指的是哪些循环。这不是一种好的延迟方法;8位计时器将从255到零,但循环在
TCNT0<255
时进行测试,只有当
TCNT0
正好为255时,此状态才可能为假如果中断发生且处理时间长于单个计数,则很可能会错过,从而使延迟非确定性地长于预期时间。相反,应使用计时器换行中断来递增计数器,并轮询该计数器,而不是
TCNT0