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

时间:2016-01-13 13:46:23

标签: c++ c arm

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

#define WATCHDOG0_LOAD_R        (*((volatile uint32_t *)0x40000000))

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

2 个答案:

答案 0 :(得分:11)

让我们一步一步:

0x40000000

是你的记忆地址。

(uint32_t *)0x40000000

将其强制转换为指向uint32_t类型的内存地址的指针,这意味着32位没有符号。

(volatile uint32_t *)0x40000000

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

*((volatile uint32_t *)0x40000000)

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

答案 1 :(得分:4)

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

  • 0x40000000是微存储器映射中的寄存器地址
  • 寄存器为32位宽,表示必须为uint32_t *
  • 添加
  • volatile以告诉编译,以避免优化该变量,因为可能会更改,例如,在中断例程中。
  • last:*取消引用指针:使您能够访问该特定寄存器的内容。