我正在编写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??我错过了什么???
2条答案
按热度按时间tzcvj98z1#
结构中最大的元素有两个字节。它必须在可被2整除的偏移处对齐。
假设你的struct有一个sizeof == 9,那么如果你有一个这些struct的数组,数组中的第二个元素将没有它的成员:
wTotalLength
正确对齐。举例来说:
Sizeof是9,你有一个结构体数组
usbtmc_config_descriptor[2]
,你从地址0开始。结构体数组中的下一个元素位于地址9。成员wTotalLength
的偏移量为+2,这使其地址为11。未正确对齐。usbtmc_config_descriptor[0]
的地址为0usbtmc_config_descriptor[1]
的地址是9usbtmc_config_descriptor[1].wTotalLength
的地址是11sd2nnvve2#
您可以观察到 * 结构填充 *(取决于处理器及其ABI)。参见this
您有一个成员
wTotalLength
,其类型为uint16_t
。它必须在您的体系结构上对齐两个字节。所以整个结构必须对齐到两个字节。因此,附加一个字节的额外间隙。如果没有这样的间隙,usbtmc_config_descriptor
-s阵列的奇数元素将未对准。访问它们可能会生成SIGBUS
或alignment trap。