我正在分析外围驱动程序的文件,并找到了一些寄存器映射代码.我有关于指针的基本知识,但我无法理解下面的代码.
#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.
分析 (*((volatile uint32_t *)0x40000000))
0x40000000 是微内存映射中寄存器的地址uint32_t *volatile 添加来告诉 compile 避免优化该变量,因为它可能会更改,例如,在中断例程中。*取消引用指针:使您能够访问该特定寄存器的内容。| 归档时间: |
|
| 查看次数: |
3476 次 |
| 最近记录: |