" loop_until_bit_is_set"之间的差异macro和while()表达式

时间:2015-05-16 02:50:32

标签: c avr avr-gcc

这段代码在ATmega2560上运行,那么这两者之间的区别是什么:

while(UCSR0A & 0b00100000 == 0);  // check UDRE0 bit if it is 1

loop_until_bit_is_set(UCSR0A, UDRE0);

你可以看到这是用于UART传输,但是如果我使用第一个,我无法在终端上获得所需的输出,例如,如果我printf("Hello world\n");实际的终端显示是:{{ 1}}。然而后者有效。您可以在HeHeHe......

中找到这段代码

1 个答案:

答案 0 :(得分:3)

==的优先级高于&;另外,无需检查== 0 - 您应该尝试

while(!(UCSR0A & 0b00100000));

或者更确切地说,使用位宏

while(!(UCSR0A & _BV(UDRE0)));

代替。