2016-12-15 17 views
0

はIO-一部がメモリ0x32のアドレスにマッピングされると仮定する書き込みマクロ指令はC言語ポート

#define portx 0x32 

がどのレジスタ対応する値を格納することによってポートを書き込むC言語のマクロを構築するために定義されて?

+0

ようこそstackoverflow.com [ヘルプページ](http://stackoverflow.com/help)、特に[ここではどのトピックを聞くことができますか?](http://stackoverflow.com/help/)のセクションを読んでください。 on-topic)と[[どのような種類の質問を避けるべきですか?]](http://stackoverflow.com/help/dont-ask)を参照してください。また、[ツアーを受けてください](http://stackoverflow.com/tour)と[良い質問をする方法を読む](http://stackoverflow.com/help/how-to-ask)もご覧ください。最後に、[最小限の完全で検証可能な例](http://stackoverflow.com/help/mcve)の作成方法を学んでください。 –

+0

別の複製については[this](http://stackoverflow.com/a/31266754/584518)を参照してください。 – Lundin

答えて

0

マクロを使用しなければならない場合は、一般的に、それはこのようなものになるだろう:

#define WRITE_PORT(port, val) *((volatile uint8_t *)(port)) = (val) 

、あなたはその後、例えば、これを起動するかもしれません

WRITE_PORT(portx, 0xff); // write 0xff to portx 

これは、8ビットポートを前提としています。

また、I/O読み取り/書き込みがコンパイラによって最適化されないようにするため、volatileの使用にも注意してください。

+0

ヴァールとは何ですか? *((volatile uint8_t *)(port))ポートにマップされたIOのアドレスは? – Sara

+0

'val'は2番目のマクロパラメータ、つまりポートに書き込まれる値です。 '*((volatile uint8_t *)(port))'は単に数字のポートアドレスをポインタにキャストし、それが指し示すアドレスに書き込むためにそのポインタを逆参照します。 –

+0

よろしくお願い致します。 IO-partがアドレス0x32にマップされ、ディレクティブが#define portx 0x32を定義すると、マクロは#define WRITE_PORT(port、val)になります。 – Sara