• ベストアンサー

SH7144のレジスタのポインタに関して

マイコン初心者です。 現在GCC(GCC Developer Lite)を使用して、SH7144の勉強をしています。 A/Dコンバーターを使用する際に、分らないことがあるため質問いたします。 たとえばAD0のADDR0~3から値を読み出す際に、 int data[2]; という変数を作っておき、 for(i=0; i < 3; i++){ data[i] = AD0.ADDR(0~3).WORD; } という風にdata[]へ値を入れるためには、AD0.ADDR(0~3).WORDの所をどのように指定すればよいのでしょうか。 ご教授願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

要するにバラで定義されてるものを配列のように扱いたいってことですか。 各レジスタのアドレスを持っておくやり方ですかねぇ。 unsigned short *ad0_addr[] = {&AD0.ADDR0.WORD, &AD0.ADDR1.WORD, &AD0.ADDR2.WORD, &AD0.ADDR3.WORD} unsigned short data[4]; int i; for(i = 0; i < 4; i ++){ data[i] = *ad0_addr[i]; }

maa_teru
質問者

お礼

貴重なアドバイスありがとうございました。 実機で動きました。 またひとつポインタについて勉強になりました。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • tadys
  • ベストアンサー率40% (856/2135)
回答No.2

次のように定義すればいいでしょう。 intのサイズが16ビットの場合で16ビットでアクセスする時 #define ADDR (volatile int *)0xFFFF8420L これで data[i] = ADDR[i] ; のように記述できます。 ADDR0 を直接指定したい場合は #define ADDR0 *(volatile int *)0xFFFF8420L

maa_teru
質問者

お礼

貴重なアドバイスありがとうございました。 アドバイス通り実機で動かすことができました。 一方、下記のようなコードで、ADDR0~2まで読めているようなのですが、for文の中のad0_addrだけで、ADDR0~2まで読めてしまう理由が分りませんでした。ad0_addrはポインタでADDR0のアドレス0xFFFF8420を指定していると思っているのですが、ad0_addrが指定しているアドレスがどのような挙動をとっているのかがいまいちつかめません。 御時間ありましたらご教授の程お願いいたいます。 #define ad0_addr (volatile int *) 0xFFFF8420L for(i = 0; i < 2; i ++) { data[i] = ad0_addr; }

すると、全ての回答が全文表示されます。

関連するQ&A