【问题标题】:Why could I do a right shift by two bits to access to the GPIO at the odroid board?为什么我可以右移两位来访问 odroid 板上的 GPIO?
【发布时间】:2016-11-01 17:16:21
【问题描述】:

Here 是一个 C 源代码示例,用于处理 odroid XU3 板上的 GPIO。我的问题是>> 2 在这样的结构中的用途是什么:

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

【问题讨论】:

    标签: c arm gpio odroid


    【解决方案1】:
    • gpio 是一个uint32_t 指针。

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

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

    【讨论】:

      【解决方案2】:

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

      static volatile uint32_t *gpio;
      

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

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

      也可以这样写:

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

      但您经常会看到用于 2 次方的移位。现代编译器很容易做到这一点,你不会在代码中看到一个划分(甚至是一个转变,因为这个术语可以在编译时计算)。

      【讨论】:

      • 谢谢。我在gpio 的声明中忽略了uint32_t。顺便说一句:我可以在这里使用uint8_t 吗?我是ARM的新手。据我所知,这些词的 ARM 寻址更为优化。
      猜你喜欢
      • 1970-01-01
      • 2020-04-06
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多