为什么使用2个指针指向atmega微控制器的寄存器地址?

时间:2017-07-26 09:18:25

标签: c pointers avr atmega avr-gcc

此行定义了avr微控制器中DDRD寄存器的地址

#define myDDRD *((volatile unsigned char* const) 0x31)

您能否澄清一下如何在上面的行中使用指针? 为什么我们需要第一个星号?不应该第二个足以指向地址0x31?

1 个答案:

答案 0 :(得分:8)

您可以将*((volatile unsigned char* const) 0x31)分为两部分:
一个内部部分:(volatile unsigned char* const) 0x31
和一个外部部分:*( inner part )

内部将整数0x31强制转换为常量的volatile unsigned char指针。
指针类型由类型名称和类型名称后面的星号组成:type*。要使用表达式括号,请使用(type)expression

外部取消引用指针包含的地址,因为星号位于其前面:*pointer以便访问它的值。

  

如果我们只考虑内部部分,为什么它不足以从地址读取和写入?

想象一下指针int* intPtr已经指向一个有效的整数。如果您现在想要更改该整数,则必须按*intPtr = 42;进行更改。如果你改为intPtr = 42;,你会把42写入指针值而不是它指向的地址,这样42就是指针所包含的新地址。

简而言之:
如果它位于分配的右侧,则宏从地址unsigned char读取一个字节(0x31),如果它在左侧,则向其写入一个字节

<强>用法:
典型的用法是进行位操作,例如清除或设置位于该特定地址的寄存器上的单个位:

myDDRD &= ~(1 << PD0); /* clear bit 0 as PD0 is defined as 0 */
myDDRD |= (1 << PD1);  /* set bit 1 as PD1 is defined as 1   */

有关位操作的更多信息,请参见此处:How do you set, clear, and toggle a single bit?