【问题标题】:#define PA6 (*((volatile unsigned long *) 0x40004200)) [duplicate]#define PA6 (*((volatile unsigned long *) 0x40004200)) [重复]
【发布时间】:2016-06-03 14:40:46
【问题描述】:
#define  PA6  (*((volatile unsigned long *) 0x40004200))

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

【问题讨论】:

  • 有一些解释here.
  • 它根本不是“指向十六进制地址的指针”。这甚至没有多大意义,地址不是“十六进制”。这只是符号。
  • 它是自我记录的,基本的 C。该数字被类型转换为无符号长地址,然后指针表示我们要访问该地址。十六进制、十进制、八进制等只是表示数字的一种方式。
  • 该问题与此stackoverflow.com/q/30663596/694576 有关,如果不是重复的话。

标签: c embedded


【解决方案1】:

它将值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 端口的声明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多