C 为什么我可以右移两位来访问odroid板上的GPIO?

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

是在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到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中,单词的寻址更为优化。