Here是一个C源代码示例,用于处理odroid XU3板上的GPIO。我的问题是*(gpio + (0x0c24 >> 2)) |= (1 << 2);
在这样的结构中的用途是什么:
struct sockaddr_in *local = malloc(sizeof (struct sockaddr_in *));
答案 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);
但通常你会看到用于两个权力的转变。现代编译器很容易进行这种优化,你不会在代码中看到这样的划分(甚至是移位,因为术语可以在编译时计算)。