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 は揮発性を認識し、レジスタへのアクセスを再ルーティングします。

また、CPU は特定のメモリ位置がどのレジスタにルーティングされるかをどのように認識しますか? それを示す表がありませんか?

4

1 に答える 1

1

いいえ、volatileC コンパイラが変数に関するコードを最適化しないことを意味します。これは、ポインターを介してハードウェアとインターフェイスする場合に非常に重要です。

かなり不自然な例として、printer格納されている任意のバイトをマシンが出力するように設定されたポインターがあるとします。次に、このコードは次のように出力されますaa

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

ただし、コンパイラは 2 番目の代入が不要であると判断し、それを最適化してvolatile、これを防ぎます。


あなたの特定の例では、特定のメモリアドレスがレジスタ(またはレジスタプロキシ)として機能するようにマシンが設定されているようです。

于 2013-10-09T18:24:24.103 に答える