这是处理 odroid XU3 板上的 GPIO 的 C 源代码示例。我的问题是这样的结构的>> 2
目的是什么:
*(gpio + (0x0c24 >> 2)) |= (1 << 2);
这是因为变量是这样声明的:
static volatile uint32_t *gpio;
所以它是一个指向 32 位无符号整数的指针。这意味着如果我们将1
代码添加到指针中,实际引用的地址将比以前晚 4 个字节。这就是指针算法在 C 中的工作方式。
因此,要使用基数的字节偏移量0xc24
,该偏移量需要按比例缩小 4,这就是右移两位的作用。
也可以这样写:
*(gpio + 0xc24 / 4) |= (1 << 2);
但是您经常会看到用于 2 次方的班次。现代编译器很容易进行这种优化,您不会在代码中看到对此的划分(甚至是转变,因为该术语可以在编译时计算)。
gpio
是一个uint32_t
指针。
地址0x24
是按字节给出的。
当我们添加 1 到 32 位指针时,地址会跳转 4 个位置。因此,我们必须添加address/4
才能到达正确的位置。(>>2
与除以 4 相同)