【发布时间】:2016-11-01 17:16:21
【问题描述】:
Here 是一个 C 源代码示例,用于处理 odroid XU3 板上的 GPIO。我的问题是>> 2 在这样的结构中的用途是什么:
*(gpio + (0x0c24 >> 2)) |= (1 << 2);
【问题讨论】:
Here 是一个 C 源代码示例,用于处理 odroid XU3 板上的 GPIO。我的问题是>> 2 在这样的结构中的用途是什么:
*(gpio + (0x0c24 >> 2)) |= (1 << 2);
【问题讨论】:
gpio 是一个uint32_t 指针。
地址0x24是按字节给出的。
当我们将 1 加到 32 位指针时,地址会跳转 4 个位置。所以,我们必须添加address/4 才能到达正确的位置。 (>>2 与除以 4 相同)
【讨论】:
这是因为变量是这样声明的:
static volatile uint32_t *gpio;
所以它是一个指向 32 位无符号整数的指针。这意味着如果我们将代码中的1 添加到指针中,实际引用的地址将比以前晚 4 个字节。这就是指针算法在 C 中的工作原理。
因此,要使用基址的字节偏移量0xc24,该偏移量需要按比例缩小四倍,这就是右移两位的作用。
也可以这样写:
*(gpio + 0xc24 / 4) |= (1 << 2);
但您经常会看到用于 2 次方的移位。现代编译器很容易做到这一点,你不会在代码中看到一个划分(甚至是一个转变,因为这个术语可以在编译时计算)。
【讨论】:
gpio 的声明中忽略了uint32_t。顺便说一句:我可以在这里使用uint8_t 吗?我是ARM的新手。据我所知,这些词的 ARM 寻址更为优化。