2

関数:

#define ASSOC(port) (*(volatile bit_field *) (&port))

関数呼び出し:

#define SCLK ASSOC(PORTC).bit0

次のような構造体として定義された bit_field:

typedef struct {
 unsigned char bit0 :1, bit1 :1, bit2 :1, bit3 :1, bit4 :1, bit5 :1,
   bit6 :1, bit7 :1;
} bit_field;

&port がどこに定義されているかわかりません。

関数がどのように読み取られ、どのように機能するかを誰かが説明してもらえますか? 私はポインターが苦手で、特にこの例は、先頭と末尾の "*" とポートの "&" が非常に紛らわしいです。

ありがとうございました

4

3 に答える 3

4

port定義されていません。ここでわかるように、これは ASSOC への引数です。

#define ASSOC(port) /* etc. */

また、は 8 ビットcharであるため、 であると想定しています。in は、単にメモリ内のアドレスを取得するのに役立ちますbit_field&&port

次に ASSOC は&porta にキャストし、最初にvolatile bit_field *エクストラが*あり、結果のポインターの内容を直接指します。

したがって、一度 ASSOC(port) を呼び出すと、bit_field 型の構造体として使用できます。たとえば、SCLKマクロは の最初のビットを提供しPORTCます。

于 2010-12-26T17:56:10.667 に答える
2

定義するASSOCマクロはインプレース キャストです。

  1. 値を渡しますport(この場合、それは他のマクロからのものですSCLK)
  2. ASSOC演算子portでのアドレスを取得します&
  3. ASSOCportのアドレスを a にキャストします(volatile bit_field *)
  4. ASSOC 逆参照( *s) のアドレスbit_field

結果は最初と同じビットですが、bit_field構造体として使用できます。

于 2010-12-26T18:03:05.197 に答える
1

ASSOC私が想定しているものはchar名前付きであり、 の個々のビットと同じ値を持つPORTCを返します。bit_fieldPORTC

SCLKビット フィールドのビットの 1 つを返します。

それをパラメータとして受け取ってPORTC渡してASSOCいます。

于 2010-12-26T17:56:00.497 に答える