2012-01-24 146 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 –