我是一个新手,已经开始编程嵌入式系统,我正在与其他人的代码合作。但是,有一个结构定义我无法理解。
struct PACKED {
uint8_t cmd;
uint8_t int_status;
uint8_t v[14];
} rx, tx = { cmd : REG_ADDRES | 0x80, };
感谢您了解cmd : REG_ADDRES | 0x80,
行的任何帮助。
提前致谢。
答案 0 :(得分:4)
这是组合结构类型定义,并定义了该类型的两个变量。所以它与下面的代码相同,除了下面的代码被修复为使用C指定的初始化语法:
struct PACKED {
uint8_t cmd;
uint8_t int_status;
uint8_t v[14];
};
struct PACKED rx; // uninitialized, do not use until initialized elsewhere
struct PACKED tx = { .cmd = REG_ADDRES | 0x80 }; // cmd field initialized with value
请注意,上面已初始化整个tx
,未给定显式值的字段初始化为0.
如果你想知道REG_ADDRES | 0x80
是什么意思,它是简单的整数表达式,使用按位OR 进行计算,所以它将第7位设置为1,并取其他位0。 6来自REG_ADDRES
,因为他们在那里。
答案 1 :(得分:2)
tx = { cmd : REG_ADDRES | 0x80, };
行正在做的是初始化名为tx
的{{1}}类型的对象,其第一个变量(即PACKED
)正在使用该值进行初始化uint8_t cmd
(REG_ADDRES | 0x80
和REG_ADDRES
的按位OR。
在代码中,它与:
相同0x80
答案 2 :(得分:2)
基本上,这部分定义了这个变量的内容。
它是您使用的编译器的扩展; C99以稍微不同的方式定义它。在那里你会写
struct PACKED {
uint8_t cmd;
uint8_t int_status;
uint8_t v[14];
} rx, tx = { .cmd = REG_ADDRES | 0x80 };
这种宣告事物的方式是非常危险的,因为它很容易被忽略,确实只有tx
被初始化。
更好的方法是
// first declare the struct as a type
struct PACKED uart {
uint8_t cmd;
uint8_t int_status;
uint8_t v[14];
};
struct PACKED uart rx;
struct PACKED uart tx = { .cmd = REG_ADDRES | 0x80 };