C sizeof(xx)问题...... ??? USB设备描述符

时间:2014-10-23 16:10:06

标签: c usb cortex-m3

我正在编写USB设备固件...我有以下struct typedef

typedef struct  {
    uint8_t bLength;
    uint8_t bDescriptorType;
    uint16_t wTotalLength;
    uint8_t bNumInterfaces;
    uint8_t bConfigurationValue;
    uint8_t iConfiguration;
    uint8_t bmAttributes;
    uint8_t bMaxPower;
} usbtmc_config_descriptor;

根据我的计算,这是9个字节,但是当我这样做时

sprintf(temp, "size of config is %02x, %d", sizeof(usbtmc_config_descriptor), sizeof(usbtmc_config_descriptor));
prints(temp);

终端吐出以下内容

size of config is 0a, 10

我绝对不知所措...... 如果你想知道print()方法只是我写的一个方法,通过UART将字符串打印成超级终端,然后是\ r \ n以便于使用......

这是那些认为重要的人的整个方法

void prints(const char* message){
    MSS_UART_polled_tx_string(&g_mss_uart0, ((uint8_t *)message));
    unsigned char newline[2] = {0x0A, 0x0D};
    MSS_UART_polled_tx_string(&g_mss_uart0, newline);
}

可能与情况有关的一些背景信息,这是Cortex M3,Smartfusion Soc的固件代码,使用SoftConsole和GCC 4.4.1 CodeSourcery工具进行编译......

我怎么可能没有得到9的sizeof ???? 我错过了什么?

2 个答案:

答案 0 :(得分:2)

你struct中最大的元素有两个字节。它必须以可被2整除的偏移量对齐。

想象一下你有一个sizeof == 9的struct,然后如果你有一个这些结构的数组,那么数组中的第二个元素就不会有它的成员:wTotalLength正确对齐。

例如:

sizeof是9,你有一个结构usbtmc_config_descriptor[2]数组,你从地址0开始。结构数组中的下一个元素来自地址9.成员wTotalLength处于偏移量+2使其地址为11.未正确对齐。

usbtmc_config_descriptor[0]的地址为0

usbtmc_config_descriptor[1]的地址是9

usbtmc_config_descriptor[1].wTotalLength的地址是11

答案 1 :(得分:1)

您观察结构填充(取决于处理器及其ABI)。参见例如this

您的成员wTotalLength的类型为uint16_t。它必须在您的架构上对齐两个字节。因此整个结构必须与两个字节对齐。因此,附加了一个字节的额外间隙。如果没有这样的间隙,usbtmc_config_descriptor - s数组的奇数元素将会错位。访问它们可能会生成SIGBUSalignment trap