Резервные __packed__ атрибуты - PullRequest
       35

Резервные __packed__ атрибуты

3 голосов
/ 26 августа 2010

Этот код предназначен для микропроцессора 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;

1 Ответ

2 голосов
/ 26 августа 2010

Прежде всего, я рекомендую компилировать с -Wall.

Теперь:

  1. Структура BlobForSomeChip имеет объявленные 7 битов.Обычно это будет 4 байта из-за выравнивания, но с упакованными атрибутами это будет только 1 байт.
  2. A unsigned char[4] не может быть упакован.Длина всегда будет 4 байта, несмотря ни на что.

Короче говоря:

  1. struct BlobForSomeChip = 1 байт
  2. unsigned char[4] = 4байты
  3. BlobData = 4 байта (самый большой размер элемента).

В заключение, упакованные атрибуты в BlobData не требуются.GCC будет просто игнорировать их, если они используются - смотрите вывод, используя -Wall.

...