Hello,
I observed a strange behaviour which I would rate as a Compiler bug but it could be also a language feature which I didn't know until now.
I have the following defines:
typedef union
{
uint32_t u32;
uint16_t u16[2];
uint8_t u8[4];
float f;
} uMsgDataValue;
#define NFC_WATCH_MODE_IMPEDANCE 0xF7
#define NFC_WATCH_MODE_SENSITIVITY 8
#define NFC_WATCH_MODE_POLLINGINTERVAL 300
When I create now an instance of the union and initialize it, the first two initialization values are overwritten with 0. But only, when I use u8 and u16 in the initialization list. When I use only u16 or initiaize the value later via normal assignment it works.
uMsgDataValue msgDataValue = {.u8[0] = NFC_WATCH_MODE_IMPEDANCE,
.u8[1] = NFC_WATCH_MODE_SENSITIVITY,
.u16[1] = NFC_WATCH_MODE_POLLINGINTERVAL};
print("msgDataValue.u32=0x%X\n",msgDataValue.u32);
//This prints 0x012C0000. So u8[0] and u8[1] are zero
uMsgDataValue msgDataValue2 = {.u16[0] = ((uint16_t)(NFC_WATCH_MODE_SENSITIVITY)<<8) + (NFC_WATCH_MODE_IMPEDANCE),
.u16[1] = NFC_WATCH_MODE_POLLINGINTERVAL};
print("msgDataValue2.u32=0x%X\n",msgDataValue2.u32);
//This gives the correct value of 0x012C08F7
msgDataValue.u8[0] = NFC_WATCH_MODE_IMPEDANCE;
msgDataValue.u8[1] = NFC_WATCH_MODE_SENSITIVITY;
msgDataValue.u16[1] = NFC_WATCH_MODE_POLLINGINTERVAL;
print("msgDataValue.u32=0x%X\n",msgDataValue.u32);
//This prints also the correct value
Is it not allowed in c to use different integer types in the list?
I'm using SDK Version 1.9.1
Regards
Erwin