为什么使用2个指针指向atmega微控制器中的寄存器地址?
Why use 2 pointers to point to register address in atmega microcontroller?
这一行定义了 avr 微控制器中 DDRD 寄存器的地址
#define myDDRD *((volatile unsigned char* const) 0x31)
能否请您说明一下指针在上一行中是如何使用的?
为什么我们需要第一个星号?第二个不应该足以指向地址 0x31 吗?
您可以将 *((volatile unsigned char* const) 0x31)
分成两部分:
一个内部:(volatile unsigned char* const) 0x31
和一个外部:*( inner part )
.
内部将整数0x31
转换为常量volatile unsigned char
指针。
指针类型由类型名称和类型名称后的星号组成:type*
。要转换表达式括号,请使用 (type)expression
.
外部取消引用指针包含的地址,因为星号在它前面:*pointer
为了访问它的值。
If we take the inner part only why it isn't enough to read and write from the address?
想象一个指针 int* intPtr
已经指向一个有效的整数。如果您现在想更改该整数,则必须按 *intPtr = 42;
进行。如果你这样做 intPtr = 42;
你会写 42 到指针值而不是它指向的地址,所以 42 将是指针包含的新地址。
简而言之:
宏从地址 0x31
读取一个字节 (unsigned char
) 如果它在分配的右侧,如果它在左侧则写入一个字节。
用法:
典型的用法是进行位操作,例如清除或设置位于该特定地址的寄存器上的单个位:
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?
这一行定义了 avr 微控制器中 DDRD 寄存器的地址
#define myDDRD *((volatile unsigned char* const) 0x31)
能否请您说明一下指针在上一行中是如何使用的? 为什么我们需要第一个星号?第二个不应该足以指向地址 0x31 吗?
您可以将 *((volatile unsigned char* const) 0x31)
分成两部分:
一个内部:(volatile unsigned char* const) 0x31
和一个外部:*( inner part )
.
内部将整数0x31
转换为常量volatile unsigned char
指针。
指针类型由类型名称和类型名称后的星号组成:type*
。要转换表达式括号,请使用 (type)expression
.
外部取消引用指针包含的地址,因为星号在它前面:*pointer
为了访问它的值。
If we take the inner part only why it isn't enough to read and write from the address?
想象一个指针 int* intPtr
已经指向一个有效的整数。如果您现在想更改该整数,则必须按 *intPtr = 42;
进行。如果你这样做 intPtr = 42;
你会写 42 到指针值而不是它指向的地址,所以 42 将是指针包含的新地址。
简而言之:
宏从地址 0x31
读取一个字节 (unsigned char
) 如果它在分配的右侧,如果它在左侧则写入一个字节。
用法:
典型的用法是进行位操作,例如清除或设置位于该特定地址的寄存器上的单个位:
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?