C sizeof(xx)issue... USB设备描述符

k5ifujac  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(140)

我正在编写USB设备固件...我有下面的结构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


我完全不知所措...如果你想知道prints()方法只是我写的一个方法,通过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的固件代码,使用带有GCC 4.4.1 CodeSourcery工具的SoftConsole进行编译...
为什么我的sizeof的总数不是9??我错过了什么???

tzcvj98z

tzcvj98z1#

结构中最大的元素有两个字节。它必须在可被2整除的偏移处对齐。
假设你的struct有一个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

sd2nnvve

sd2nnvve2#

您可以观察到 * 结构填充 *(取决于处理器及其ABI)。参见this
您有一个成员wTotalLength,其类型为uint16_t。它必须在您的体系结构上对齐两个字节。所以整个结构必须对齐到两个字节。因此,附加一个字节的额外间隙。如果没有这样的间隙,usbtmc_config_descriptor-s阵列的奇数元素将未对准。访问它们可能会生成SIGBUSalignment trap

相关问题