2

我有一些代码

   // Locals to hold pointers to the hardware

static volatile uint32_t *gpio ;
static volatile uint32_t *pwm ;
static volatile uint32_t *clk ;
static volatile uint32_t *pads ;

     void setPadDrive (int group, int value)
{
  uint32_t wrVal ;

  if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO))
  {
    if ((group < 0) || (group > 2))
      return ;

    wrVal = BCM_PASSWORD | 0x18 | (value & 7) ;
    *(pads + group + 11) = wrVal ;

    if (wiringPiDebug)
    {
      printf ("setPadDrive: Group: %d, value: %d (%08X)\n", group, value, wrVal) ;
      printf ("Read : %08X\n", *(pads + group + 11)) ;
    }
  }
}

所以从上面CPU寄存器被内存映射并由指针指向。因此,如果我访问了这些内存位置,CPU 会看到 volatile 并且它将重新路由对寄存器的访问。

此外,CPU 如何知道特定的内存位置将路由到哪个寄存器?我是否缺少表明这一点的表格?

4

1 回答 1

1

不,volatile意味着 C 编译器不会优化有关变量的代码。在通过指针与硬件接口时,这绝对是至关重要的。

作为一个非常人为的例子,假设我有一个指针printer,它的设置方式是机器将打印存储在其中的任何字节。然后这段代码将打印aa

*printer = 'a';
*printer = 'a';

但是,编译器可能会认为第二个赋值是不必要的并对其进行优化 -volatile防止这种情况发生。


在您的特定示例中,似乎机器已设置为使特定内存地址用作寄存器(或寄存器代理)。

于 2013-10-09T18:24:24.103 回答