用于USB驱动程序实现的联盟和结构

时间:2014-02-21 06:02:52

标签: c

我正在尝试使用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;

2 个答案:

答案 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个字节。