c - 为什么使用2个指针指向atmega微 Controller 中的寄存器地址?

标签 c pointers avr atmega avr-gcc

此行定义了 avr 微 Controller 中 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?

关于c - 为什么使用2个指针指向atmega微 Controller 中的寄存器地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45322600/

相关文章:

c - 在 C 中使用 char 数组深度复制结构(如何复制数组?)

c - 释放大数组指针时出现段错误

FORTRAN 中子程序的指针

c - 初始化匿名指针数组

assembly - AVR 微架构如何能够仅在 1 个时钟周期内从 GP 寄存器获取 2 个操作数到 ALU?

assembly - AVR 汇编标签*2

c - SSE/AVX vector 类型的差异

c - 使用共享内存以及如何使用 IPC_RMID 正确取消分配空间

c - XMEGA AVR 中的按钮去抖动

C 程序练习。简单的交易报告