#define PA6(*((volatile unsigned long*)0x40004200))

shu*_*rma 2 c embedded

#define  PA6  (*((volatile unsigned long *) 0x40004200))
Run Code Online (Sandbox Code Playgroud)

上面的定义是什么意思?我只能推断出PA6是指向十六进制地址的指针.

leg*_*cia 7

它将值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,编译器必须在每次迭代中执行内存读取.