0

私はソフトコアプロセッサ、アルテラのNios IIのプログラミングを行っています。以下は、チュートリアルの1つにあるコードです。ハードウェア(DE2ボード)でテストすることでコードを機能させることができますが、理解できませんでした。コード。

#define Switches (volatile char *) 0x0003000
#define LEDs (char *) 0x0003010
void main()
{ while (1)
*LEDs = *Switches;
}

私が知っているのは、定数またはマクロ#defineを定義するために使用されますが、

  1. (char *) 0x0003010なぜ上記のコードで、、のようなキャストがあり#defineますか?
  2. なぜ2つの定数でSwitchesありLEDs、定数ではなく変数のように機能するのでしょうか。
4

4 に答える 4

4

と は、実際の入力 ( の場合) と出力 ( の場合)へのメモリ マッピングを表しているSwitchesようです。LEDsSwitchesLEDs

したがって、あなたの答えは次のとおりです。

  1. 入力スイッチのバイトは、アドレス 0x0003000 にメモリ マップされます。バイトとしてアクセスするには、アドレス 0x0003000 にあるものは何でも a であることをコンパイラーに伝える必要がありますchar(実際には、そのアドレスの値が a であることを伝えてvolatile char、コンパイラーがその事実を最適化しないようにします)そのアドレスの値はいつでも変更される可能性があります)。

  2. これら定数ですが、定数ポインターです。つまり、アドレスは一定ですが、それらのアドレスに含まれる値は一定ではありません。

メモリアドレス 0x0003000 から読み取られたものはすべて、クロックサイクルごと (またはその程度) にアドレス 0x0003010 に書き込まれます。これにより、スイッチが瞬時に LED を切り替えているように見えます。

于 2010-06-10T01:53:35.267 に答える
4

1) 上記のコードで、#define に (char *) 0x0003010 のようなキャストがあるのはなぜですか?

プリプロセッサ マクロは、テキストの置き換えです。したがって、コードは次のようになります

while (1) {
  *(char *) 0x0003010 = *(volatile char *) 0x0003000
}

これは、0x3000 にマッピングされた入力 (スイッチ) の内容を 0x3010 にマッピングされた出力 (LED) に割り当てます。

2) スイッチと LED の 2 つの定数が、定数ではなく変数のように機能するのはなぜですか?

これらはポインタであることに注意してください。したがって、それらは常に同じ場所を指します (これはたまたまメモリ マップされた IO ピンのカップルなどです)*。逆参照演算子。

于 2010-06-10T02:03:06.620 に答える
3

C では、マクロは単純な置換です。

コンパイラがコード内で検出するたびLEDsに、それを に置き換えます(char *) 0x0003010

したがって、コードは実質的に次のようになります。

void main()
{
    while (1)
        *(char *) 0x0003010 = *(volatile char *) 0x0003000;
}
于 2010-06-10T01:55:57.603 に答える
0

#defines での型キャストがなければ、それらは char* および volatile char* として扱われません。*Switches にあるものは *LEDs にコピーされます。

于 2010-06-10T01:57:45.370 に答える