我正在编写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 ???? 我错过了什么?
答案 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)
您的成员wTotalLength
的类型为uint16_t
。它必须在您的架构上对齐两个字节。因此整个结构必须与两个字节对齐。因此,附加了一个字节的额外间隙。如果没有这样的间隙,usbtmc_config_descriptor
- s数组的奇数元素将会错位。访问它们可能会生成SIGBUS
或alignment trap。