1

質問:

教育目的で、RaspberryPI が GPIO ヘッダーとどのようにインターフェイスするかを正確に理解しようとしています。うまく機能する拡張ボードの LED を制御する簡単なプログラムがあります。ただし、GDB を使用して、マップされた制御レジスタのビットを変更するプログラムを確認したいと考えていました。通常、GDB では次のようにします。

x /t 0x20200000

しかし、おそらくターゲットメモリがプロセス空間にないため、これにより次のエラーが発生するようです。

0x20200000: Cannot access memory at address 0x20200000

メモリ領域をマッピングしようとしましたが、役に立たないようです。

mem 0x20200000 0x20208192

また、GDB から呼び出す関数を作成することにも当てはまりますが、関心のあるメモリ ブロック全体を返すものを作成する方法を理解できなかったので、バイナリとして表示できます (各バイトを書き込みビットとして覗き見したくありません)。かなり広範囲に広がっています)。GDBでこれを行う方法はありますか?

サポート コード

マップするメモリ アドレス:

#define BCM2708_PERI_BASE   0x20000000
#define GPIO_BASE           (BCM2708_PERI_BASE + 0x200000)

マップされたメモリへのポインタ:

static volatile uint32_t *gpio ;

マッピング ルーチン:

int gpio_init (void)
{
  int      fd ;
  uint8_t *gpioMem;

  if ((fd = open ("/dev/mem", O_RDWR | O_SYNC) ) < 0)
  {
    fprintf (stderr, "gpio_init: unable to open /dev/mem: %s\n", strerror (errno)) ;
    return -1 ;
  }

  if ((gpioMem = malloc (BLOCK_SIZE + (PAGE_SIZE-1))) == NULL)
  {
    fprintf (stderr, "gpio_init: malloc failed: %s\n", strerror (errno)) ;
    return -1 ;
  }

  if (((uint32_t)gpioMem % PAGE_SIZE) != 0)
    gpioMem += PAGE_SIZE - ((uint32_t)gpioMem % PAGE_SIZE) ;

  gpio = (uint32_t *)mmap((caddr_t)gpioMem, BLOCK_SIZE, PROT_READ|PROT_WRITE,  MAP_SHARED|MAP_FIXED, fd, GPIO_BASE) ;

  if ((int32_t)gpio < 0)
  {
    fprintf (stderr, "gpio_init: mmap failed: %s\n", strerror (errno)) ;
    return -1 ;
  }

  return 0 ;
}
4

1 に答える 1

2

物理メモリ アドレス0x20200000は、変数に格納されているアドレスでプロセス アドレス空間にマップされているgpioため、このアドレスを で調べる必要がありますgdb。が呼び出されgpioた後の内容を出力して、その値を使用するだけです。gpio_init()

余談ですが、マッピングが行われる方法は混乱しています。メモリブロックを割り当ててmallocからマップする必要はありません。また、ファイル記述子を閉じることもできません。その関数全体は、次のように記述できます。

int gpio_init (void)
{
  int      fd ;

  if ((fd = open ("/dev/mem", O_RDWR) ) < 0)
  {
    fprintf (stderr, "gpio_init: unable to open /dev/mem: %s\n", strerror (errno)) ;
    return -1 ;
  }

  gpio = mmap(NULL, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_BASE) ;

  if (gpio == MAP_FAILED)
  {
    fprintf (stderr, "gpio_init: mmap failed: %s\n", strerror (errno)) ;
    close(fd);
    return -1 ;
  }

  close(fd);
  return 0 ;
}
于 2012-07-17T06:57:31.313 に答える