需要从GCC下的代码移植到Keil下,发现对齐这边编译无法通过,原来他们是不兼容的,需要做些修改:
<span style="font-size:14px;">//Keil下
typedef __packed union {
uint16_t W;
__packed struct {
uint8_t L;
uint8_t H;
} WB;
} WORD_BYTE;
//GCC下
struct _WB{
uint8_t L;
uint8_t H;
}__attribute__ ((packed));
typedef union _WORD_BYTE WORD_BYTE;
union _WORD_BYTE{
uint16_t W;
struct _WB WB;
}__attribute__ ((packed)); </span>
GCC不支持左值强制类型运算(这点不敢肯定)<span style="font-size:14px;">//Keil
(uint8_t *)pD += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;
//GCC
pD = ( USB_COMMON_DESCRIPTOR *)((uint8_t *)pD + ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength);</span>
GCC无法做对齐强制类型,以下为keil的方式,GCC下做类似动作是不生效的,问题描述里详细介绍
*((__packed uint32_t *)pData) = *((__packed uint32_t *)dataptr);