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. */

另外,我认为它应该是 a char,因为它bit_field有 8 位。&in&port只是用来获取它在内存中的地址。

ASSOC 依次转换&port为 a volatile bit_field *,然后*在开头有额外的内容,直接指向结果指针的内容。

因此,一旦调用 ASSOC(port),就可以将其用作 bit_field 类型的结构。例如,SCLK宏将给出PORTC.

于 2010-12-26T17:56:10.667 回答
2

您定义的ASSOC宏是就地转换。

  1. 您传入一个值port(在这种情况下,它来自另一个宏SCLK
  2. ASSOCport&运营商取得地址
  3. ASSOCport的地址转换为(volatile bit_field *)
  4. ASSOC 取消引用( *s) 的地址bit_field

结果与您开始时的位相同,但可用作bit_field结构。

于 2010-12-26T18:03:05.197 回答
1

ASSOC接受我假设的是一个char命名PORTC的,并返回一个bit_fieldPORTC.

SCLK返回位字段中的一位。

您正在接受PORTC并将其ASSOC作为参数传递给它。

于 2010-12-26T17:56:00.497 回答