我正在尝试使用PIC32mx系列为打印机设备创建主机USB驱动程序。 我正在使用Microchip Library Application示例。 其中,我发现为了发送BDT,使用下面提到的结构。 现在,BDT应该是所有8个字节,如应用说明中所述, 但是当我检查BD_ENTRY联合变量的大小时,我发现它是不同的--12个字节。如果我是对的,它应该是8个字节。 我尝试使用Mikroc编译相同代码的这个特定部分并使用proteus进行模拟,我发现字节长度(sizeof)为8个字节。
我有点困惑,我也是指针,结构和工会世界的新手。
typedef union _BD_STAT {
BYTE Val;
struct {
//If the CPU owns the buffer then these are the values
unsigned BC8:1; //bit 8 of the byte count
unsigned BC9:1; //bit 9 of the byte count
unsigned BSTALL:1; //Buffer Stall Enable
unsigned DTSEN:1; //Data Toggle Synch Enable
unsigned INCDIS:1; //Address Increment Disable
unsigned KEN:1; //BD Keep Enable
unsigned DTS:1; //Data Toggle Synch Value
unsigned UOWN:1; //USB Ownership
};
struct {
//if the USB module owns the buffer then these are
// the values
unsigned :2;
unsigned PID0:1; //Packet Identifier
unsigned PID1:1;
unsigned PID2:1;
unsigned PID3:1;
unsigned :1;
};
struct {
unsigned :2;
unsigned PID:4; //Packet Identifier
unsigned :2;
};
} BD_STAT;
typedef union __attribute__ ((packed))__BDT {
//typedef union __BDT{
struct __attribute__ ((packed)) {
//struct
BD_STAT STAT;
WORD CNT:10;
WORD ADR;
WORD ADRH;
};
struct __attribute__ ((packed)) {
//struct
DWORD res :16;
DWORD count:10;
};
DWORD w[2];
WORD v[4];
QWORD Val;
} BDT_ENTRY;
答案 0 :(得分:0)
提供所有这些匿名结构名称(暂时),以便您可以使用sizeof
进行检查。我在bitfields中看到的一个问题是,一些编译器(包括gcc,至少有一次它位于我身上)受到位域基类型的过度影响。因此,与unsigned bit:1
中的Byte
联合的那些BD_STAT
位域可能会将其位从4字节unsigned
中切除,导致BD_STAT
过大。如果您使用sizeof
验证,请尝试将基本类型更改为Byte
并查看其是否包含较小的内容。
答案 1 :(得分:0)
在BD_STAT
中使用unsigned char
代替unsigned
。
位字段始终具有基础类型的大小,而不是其大小的总和。所以BD_STAT
长4个字节。