C与微控制器:struct的起始地址是一个特定的地址?

时间:2012-05-21 16:40:30

标签: c pointers struct c-preprocessor

我正在阅读有关指针和结构的一些内容,但我只是不理解它: 微控制器的头文件中有这个内容:

#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只是一个typedefed结构,带有一些用于设置和清除中断的寄存器。很明显,(2)以某种方式管理结构起始地址是NVIC_BASE地址。 但是怎么样?

括号中的结构(NVIC_Type *)后指针(*)是什么?

1 个答案:

答案 0 :(得分: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);

相同