C 为什么我可以右移两位来访问odroid板上的GPIO?
是在odroid XU3板上处理GPIO的C源代码示例。我的问题是C 为什么我可以右移两位来访问odroid板上的GPIO?,c,arm,gpio,odroid,C,Arm,Gpio,Odroid,是在odroid XU3板上处理GPIO的C源代码示例。我的问题是>2在这种结构中的用途是什么: *(gpio + (0x0c24 >> 2)) |= (1 << 2); *(gpio+(0x0c24>>2))|=(1 gpio是一个uint32\t指针 地址0x24按字节给出 当我们将1到32位指针相加时,地址会跳转4个位置。因此,我们必须将地址/4相加才能到达正确的位置。(>2等于除以4) gpio是一个uint32\t指针 地址0x24按字节给出 当我们将1到3
>2
在这种结构中的用途是什么:
*(gpio + (0x0c24 >> 2)) |= (1 << 2);
*(gpio+(0x0c24>>2))|=(1
gpio
是一个uint32\t
指针
- 地址
0x24
按字节给出
- 当我们将1到32位指针相加时,地址会跳转4个位置。因此,我们必须将
地址/4
相加才能到达正确的位置。(>2
等于除以4)
gpio
是一个uint32\t
指针
- 地址
0x24
按字节给出
- 当我们将1到32位指针相加时,地址会跳转4个位置。因此,我们必须将
地址/4
相加才能到达正确的位置。(>2
等于除以4)
这是因为变量是这样声明的:
static volatile uint32_t *gpio;
这是一个指向32位无符号整数的指针。这意味着如果我们在指针的代码中添加1
,实际引用的地址将比以前晚4个字节。这就是指针算法在C中的工作方式
因此,要使用距基的字节偏移量0xc24
,需要将该偏移量缩小四,这就是右移两位的作用
也可以这样写:
*(gpio + 0xc24 / 4) |= (1 << 2);
*(gpio+0xc24/4)|=(1这是因为变量是这样声明的:
static volatile uint32_t *gpio;
这是一个指向32位无符号整数的指针。这意味着如果我们在指针的代码中添加1
,实际引用的地址将比以前晚4个字节。这就是指针算法在C中的工作方式
因此,要使用距基的字节偏移量0xc24
,需要将该偏移量缩小四,这就是右移两位的作用
也可以这样写:
*(gpio + 0xc24 / 4) |= (1 << 2);
*(gpio+0xc24/4)|=(1)谢谢。我在gpio
的声明中没有看到uint32\u t
。顺便问一下:我可以在这里使用uint8\u t
吗?我是ARM的新手。据我所知,在ARM中,单词的寻址更为优化。谢谢。我在gpio
的声明中没有看到uint32\u t
。顺便说一句:妈妈我在这里使用uint8\t
吗?我是ARM的新手。据我所知,在ARM中,单词的寻址更为优化。