#define PA6 (*((volatile unsigned long *) 0x40004200))
Run Code Online (Sandbox Code Playgroud)
上面的定义是什么意思?我只能推断出PA6是指向十六进制地址的指针.
它将值0x40004200转换为指向值的指针unsigned long,然后取消引用该指针,实质上是从内存中的该地址读取值.
在volatile预选赛意味着编译器应该期望在这个存储单元的值更改,恕不其知识.没有它,如果有一个循环检查此表达式的值,编译器可能决定只执行一次内存读取以优化循环:
while (PA6 == 0) {
/* do something else while waiting for PA6 to become non-zero */
}
Run Code Online (Sandbox Code Playgroud)
但是由于指针是volatile,编译器必须在每次迭代中执行内存读取.