У меня так: typedef union {
struct __attribute__((packed)) {
uint32_t RecNum; //Sequence number of record
float Offset[4];
float Multiplier[4];
uint8_t ModNum; //Module number
} Par; //Access by parameter
uint8_t Bytes[sizeof (uint32_t) + sizeof (float) * 4 * 2 + sizeof (uint8_t)]; //37 bytes as byte array
} EEPROMcfg_t;
Добавляю атрибут упаковки, чтобы компилятору не вздумалось оптимизировать выравниванием. С битами поступаю так же, только считаю размер байт совсем вручную:
typedef union {//Module status structure
struct __attribute__((packed)) {
//A byte of operation and control related flags
unsigned Cmd : 1;
unsigned ADCexc : 1;
unsigned ADCsmp : 1;
unsigned ADCrun : 1;
unsigned ADCcycle : 1;
unsigned ADCfrRdy : 1;
unsigned TxReq : 1;
unsigned Tx : 1;
//A byte of auxiliary flags
unsigned RegRead : 1;
} N; //Access to flags by name
uint8_t Byte[2]; //Status as bytes
} Status_t;