Вопрос

Этот код предназначен для микропроцессора PIC32MX Microchip. Их компилятор по существу GCC 3.4.

Я склонен использовать GCC __packed__ атрибут упаковать биты в профсоюз, а позже извлечь их как 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;
Это было полезно?

Решение

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

Сейчас:

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

Вкратце:

  1. struct BlobForSomeChip = 1 байт
  2. unsigned char[4] = 4 байта
  3. BlobData = 4 байта (его крупнейший размер члена).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top