【发布时间】:2014-11-01 20:58:20
【问题描述】:
我正在学习如何在 Linux 下为 ARM A9 编写代码。现在我访问一些外围设备,如 LEDS。我的代码实际上正在运行,但部分基于教程。 我唯一不明白的部分是:
void *virtual_base;
void *led_addr;
void *sw_addr;
int fd;
int switches;
switches=*(uint32_t *)sw_addr;
`
我不明白的部分是为什么我必须写
*(uint32_t *)sw_addr;
*sw_addr 表示它是一个变量,它指向一个特定的地址。在我的例子中,它指向特定的外围寄存器。从这个地址读取将读取我板上开关的状态。
但是什么
*(uint32_t *)sw_addr
方法?你如何解释它?
为什么我就是不能写
switches= sw_addr?
如你所见,我有点困惑。
【问题讨论】:
-
(uint32_t *)这是一个演员表,*这是取消引用您刚刚转换的对象。 -
sw_addr被定义为void *(指针)。(uint32_t *)这是一个演员表,现在说void *现在是指向uint32_t的指针。最左边的*然后表示将(uint32_t *)sw_addr指向的整数存储在开关中。需要注意的一点是,将其更改为*(int *)sw_addr或将switches更改为使用uint32_t switches定义为uint32_t可能是一个好主意。这使类型保持一致。 -
所以最好将 sw_addr 定义为 uint32_t 而不是 void?
-
@user3597998 并非总是如此。这取决于寄存器的长度。您的代码正在读取寄存器内容并将其存储在
switches中。我认为最好的方法是定义指向与相应长度匹配的寄存器的指针。 -
不管转换/重新解释如何进行,因为
sw_addr从未初始化,所以这段代码很可能会中断......