#define PA6是什么意思?

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

上述定义是什么意思?我只能推断PA6是一个指向十六进制地址的指针。

1
这里有一些解释:http://www.embedded.com/design/programming-languages-and-tools/4432746/Device-registers-in-C。 - Weather Vane
3
这并不是指向十六进制地址的“指针”,这甚至没有太多意义,因为地址本身并不是“十六进制”的,这只是一种表示方法。 - unwind
1
它是自我记录的,基本的C语言。该数字被强制转换为无符号长地址,然后指针表示我们想要访问该地址。十六进制、十进制、八进制等都是无关紧要的,只是表示数字的一种方式。 - old_timer
这个问题与 http://stackoverflow.com/q/30663596/694576 相关,如果不是重复的话。 - alk
如果那是“自我记录、基础的C语言”,我宁愿不去看“高级、复杂的C语言”。(是的,我理解所有的意思,只是觉得语法有点...恶心。) - puppydrum64
2个回答

9
它将值0x40004200强制转换为指向unsigned long类型值的指针,然后对该指针进行解引用,从内存中读取该地址处的值。volatile限定符意味着编译器应该预期该内存位置上的值可能会在其不知情的情况下发生更改。如果没有它,如果有一个循环检查此表达式的值,则编译器可能会决定仅执行一次内存读取以优化循环:
while (PA6 == 0) {
    /* do something else while waiting for PA6 to become non-zero */
}

但是由于指针是volatile类型,编译器每次都需要执行内存读取操作。


2

它以实现定义的方式将整数0x40004200转换为指针volatile unsigned long *,然后对指针进行解引用。

这似乎类似于内存映射I/O端口的声明。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接