此代码适用于Microchip的PIC32MX微处理器。他们的编译器基本上是GCC 3.4。
我倾向于使用GCC的__packed__
attribute将位域打包到一个联合中,然后将它们检索为unsigned char
(即类型惩罚),以便通过SPI或I2C发送。这个行为都是由我的实现定义的,并且完美地运行。我更喜欢这种大约一百次遮蔽和移动:)
我的问题是:下面的代码中有__packed__
个属性是多余的吗?乍一看,我认为那些顶级工会成员的人可以免除,但我不太确定。或者我可以忽略嵌套结构中的那些吗?
// Remember that bitfields cannot straddle word boundaries!
typedef struct
{
/// Some flag #1
unsigned FlagOne : 1 __attribute__((packed));
/// Some flag #2
unsigned FlagTwo : 1 __attribute__((packed));
/// A chunk of data
unsigned SomeData : 5 __attribute__((packed));
// and so on, maybe up to 32 bits long depending on the destination
} BlobForSomeChip;
/// This kind of type-punning is implementation defined. Read Appendix A (A7, A12) of
/// the MPLAB C Compiler for PIC32 MCUs manual.
typedef union
{
/// Access the members of this union to set flags, etc
BlobForSomeChip blobdata __attribute__((packed));
/// As a byte for sending via SPI, I2C etc
unsigned char bytes[4] __attribute__((packed));
} BlobData;
答案 0 :(得分:2)
首先,我建议使用-Wall
进行编译。
现在:
BlobForSomeChip
结构声明了7位。通常,由于对齐,它将是4个字节长,但对于打包属性,它只有1个字节长。unsigned char[4]
。它总是4个字节长,无论如何。简而言之:
struct BlobForSomeChip
= 1个字节unsigned char[4]
= 4个字节BlobData
= 4个字节(最大成员的大小)。总之,BlobData
上的压缩属性不是必需的。如果使用,GCC将忽略它们 - 使用-Wall
查看输出。