0

是处理 odroid XU3 板上的 GPIO 的 C 源代码示例。我的问题是这样的结构的>> 2目的是什么:

*(gpio + (0x0c24 >> 2)) |= (1 << 2);
4

2 回答 2

1

这是因为变量是这样声明的:

static volatile uint32_t *gpio;

所以它是一个指向 32 位无符号整数的指针。这意味着如果我们将1代码添加到指针中,实际引用的地址将比以前晚 4 个字节。这就是指针算法在 C 中的工作方式。

因此,要使用基数的字节偏移量0xc24,该偏移量需要按比例缩小 4,这就是右移两位的作用。

也可以这样写:

*(gpio + 0xc24 / 4) |= (1 << 2);

但是您经常会看到用于 2 次方的班次。现代编译器很容易进行这种优化,您不会在代码中看到对此的划分(甚至是转变,因为该术语可以在编译时计算)。

于 2016-11-01T09:16:21.983 回答
1
  • gpio是一个uint32_t指针。

  • 地址0x24是按字节给出的。

  • 当我们添加 1 到 32 位指针时,地址会跳转 4 个位置。因此,我们必须添加address/4才能到达正确的位置。(>>2与除以 4 相同)

于 2016-11-01T09:13:42.423 回答