Этот код предназначен для микропроцессора Microchip PIC32MX. Их компилятор по сути GCC 3.4.
Я обычно использую атрибут __packed__
GCC , чтобы упаковать битовые поля в объединение, а затем извлечь их как unsigned char
(то есть, тип-штрафование) для отправки через SPI или I2C. Это поведение все определяется моей реализацией и работает отлично. Я предпочитаю это примерно сотне линий маскировки и смещения:)
Мой вопрос: есть ли в приведенном ниже коде атрибуты __packed__
, которые являются избыточными? На первый взгляд, я думаю, что с членами профсоюза высшего уровня можно обойтись, но я не уверен. Или я могу пропустить те во вложенной структуре?
// Remember that bitfields cannot straddle word boundaries!
typedef struct
{
/// Some flag #1
unsigned FlagOne : 1 __attribute__((packed));
/// Some flag #2
unsigned FlagTwo : 1 __attribute__((packed));
/// A chunk of data
unsigned SomeData : 5 __attribute__((packed));
// and so on, maybe up to 32 bits long depending on the destination
} BlobForSomeChip;
/// This kind of type-punning is implementation defined. Read Appendix A (A7, A12) of
/// the MPLAB C Compiler for PIC32 MCUs manual.
typedef union
{
/// Access the members of this union to set flags, etc
BlobForSomeChip blobdata __attribute__((packed));
/// As a byte for sending via SPI, I2C etc
unsigned char bytes[4] __attribute__((packed));
} BlobData;