2012-01-24 84 views
-1

我知道OCIE0A=0001二进制,所以(1<<OCIE0A)只是0010?我看到这个使用频率很高,将寄存器设置为(1<<OCIE0A)的原因是什么,而不是直接将其设置为0010?什么是C中的(1 << OCIE0A)?

+1

什么是'OCIE0A'?变量的名字? – Mysticial

+0

@Mysticial十六进制。 – mugetsu

+6

在十六进制中没有'I'。此外,它甚至不会接近'0001'。 – Mysticial

回答

42

从谷歌搜索的结果来看,它看起来像是控制“定时器/计数器中断屏蔽寄存器”中的“定时器/计数器输出比较匹配中断”*位的名称, 8位AVR单片机“*它的用法如下*:

TIMSK0 |= _BV(OCIE0A); // enable compare A interrupts 
TIMSK0 &= ~_BV(OCIE0A); // disable compare A interrupts 

哪里TIMSK0是*定时器中断屏蔽寄存器*。 OCIE0A是(对于熟悉AVR代码*的人)比TIMSK0 |= 2更容易理解的标识符。

它们使用位标识符而不是掩码,因为任何halfwit编译器都可以将它们优化为位掩码相同的事物,但是从掩码→位更难*。因此,把它当作苦差事,对于所有用途来说都很容易和快速。

在不相关的说明中,数字是以二进制形式存储在计算机中的值。 “十进制”和“十六进制”是表示的那些值。所以不,OCIE0A不是“十六进制”。它是一个表示该位标志的偏移量,与1

*假设的价值无处不在的象征,我什么都不知道

+2

+1用于研究工作。 –

+3

作为嵌入式程序员,我完全同意。我讨厌阅读旧代码并发现'config_reg = 0x051C'。 “哦,我必须再次找到参考手册”。看到'config_reg = EN_FIFO |好多了EN_INT | WORD_SZ_8;” – AShelly

+1

你的假设完全正确。也可以在这里看到更多关于该主题的内容:http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_use_bv –