2012-05-21 35 views
3

我正在讀關於指針和結構的一些東西,但我只是不明白: 有一個在微控制器的headerfile此內容:C與微控制器:結構的起始地址是一個特定的地址?

#define NVIC_BASE (SCS_BASE + 0x0100) /*< NVIC Base Address */ (1) 
#define NVIC ((NVIC_Type *) NVIC_BASE) /*< NVIC configuration struct */ (2) 

在後面的代碼中,有可能是這樣的:

NVIC->ICER[0] = (1<<4); 

請問這(因爲確定)符合下列條件:

(NVIC_Type *) NVIC_BASE).ICER[0] = (1<<4); 

NVIC_Type只是一個typedef用一些寄存器來設置和清除中斷。很明顯,(2)以某種方式管理結構起始地址是NVIC_BASE地址。 但是如何?

括號(NVIC_Type *)中的結構後面的指針(*)是什麼?

回答

3

NVIC_BASE是地址。 (NVIC_Type *)是演員表,當您參考NVIC參考時,它將被解釋爲指向NVIC_Type結構的指針。

所以,當你寫NVIC->ICER[0],就好像NVIC是一個聲明的結構,但有一個固定的地址。這樣的結構佈局匹配外設存儲器映射,並與給定的基地址,寄存器排隊,讓你操縱你的硬件。

而且,是NVIC->ICER[0] = (1<<4);相同(*(NVIC_Type *) NVIC_BASE).ICER[0] = (1<<4);

+0

不應認爲是'((NVIC_Type *)NVIC_BASE) - > ICER [0] =(1 << 4);'?有一個額外的'('和' - >'而不是''' –

+0

我的頭轉置爲'(*(NVIC_Type *)NVIC_BASE).ICER [0]'。我編輯了我的答案以反映這一點。注意到! –