2012-05-21 58 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]'。我编辑了我的答案以反映这一点。注意到! –