功能:
#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;
我不知道在哪里定义了&端口。
有人可以解释一下如何阅读这个功能以及它是如何工作的吗?我对指针不是很好,特别是这个例子在前面和后面都是“*”和“&”非常混乱。与港口。
谢谢
答案 0 :(得分:4)
port
未定义。这是ASSOC的论据,你可以在这里看到:
#define ASSOC(port) /* etc. */
另外,我假设它应该是char
,因为bit_field
有8位。 &
中的&port
只是用于在内存中获取其地址。
ASSOC依次将&port
转换为volatile bit_field *
,然后在开头有额外的*
直接指向结果指针的内容。
因此,一旦调用ASSOC(端口),就可以将其用作bit_field类型结构。例如,SCLK
宏将给出PORTC
的第一位。
答案 1 :(得分:2)
您定义的ASSOC
宏是就地演员。
port
(在这种情况下,它来自另一个宏SCLK
)ASSOC
使用port
运算符&
的地址
ASSOC
将port
的地址转换为(volatile bit_field *)
ASSOC
dereferences(*
s)bit_field
结果与您开始时的位相同,但可用作bit_field
结构。
答案 2 :(得分:1)
ASSOC
采用我假设的名为char
的{{1}}并返回PORTC
,其值与bit_field
中的每个位相同
PORTC
返回位字段中的一个位。
您正在使用SCLK
并将其作为参数传递给PORTC
。