指向易失性数据的指针(*((volatile uint32_t*)0x40000000))

Dom*_*aza 2 c c++ arm

我正在分析外围驱动程序的文件,并找到了一些寄存器映射代码.我有关于指针的基本知识,但我无法理解下面的代码.

#define WATCHDOG0_LOAD_R        (*((volatile uint32_t *)0x40000000))
Run Code Online (Sandbox Code Playgroud)

我知道它定义WATCHDOG0_LOAD_R了寄存器内存地址的标识符.但我无法理解右侧的语法.任何人都可以详细解释为什么这个指针是以这种方式编写的吗?

And*_*gia 13

我们当时采取一步措施:

0x40000000
Run Code Online (Sandbox Code Playgroud)

是你的记忆地址.

(uint32_t *)0x40000000
Run Code Online (Sandbox Code Playgroud)

将此转换为指向该内存地址的指针,类型uint32_t为32位无符号.

(volatile uint32_t *)0x40000000
Run Code Online (Sandbox Code Playgroud)

volatile 基本上意味着"嘿编译器,不做任何优化;我真的想每次去那个内存地址并获取它,没有任何预取或任何特殊的东西".

*((volatile uint32_t *)0x40000000)
Run Code Online (Sandbox Code Playgroud)

表示:获取该指针标识的地址所包含的值,因此从的四个字节开始0x40000000.


LPs*_*LPs 8

分析 (*((volatile uint32_t *)0x40000000))

  • 0x40000000 是微内存映射中寄存器的地址
  • 寄存器是 32 位宽,这意味着必须是 uint32_t *
  • volatile 添加来告诉 compile 避免优化该变量,因为它可能会更改,例如,在中断例程中。
  • 最后:*取消引用指针:使您能够访问该特定寄存器的内容。

  • 还要注意取消引用。将此定义分配给整数将加载地址处的值。 (2认同)