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

时间:2016-11-01 09:02:46

标签: c arm gpio odroid

Here是一个C源代码示例,用于处理odroid XU3板上的GPIO。我的问题是*(gpio + (0x0c24 >> 2)) |= (1 << 2); 在这样的结构中的用途是什么:

struct sockaddr_in *local = malloc(sizeof (struct sockaddr_in *));      

2 个答案:

答案 0 :(得分:1)

  • gpio是一个uint32_t指针。

  • 地址0x24以字节为基础给出。

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

  • 相同

答案 1 :(得分:1)

这是因为变量声明如下:

static volatile uint32_t *gpio;

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

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

也可以这样写:

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

但通常你会看到用于两个权力的转变。现代编译器很容易进行这种优化,你不会在代码中看到这样的划分(甚至是移位,因为术语可以在编译时计算)。