Избыточный __Packed__ атрибуты
-
01-10-2019 - |
Вопрос
Этот код предназначен для микропроцессора 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
.
Сейчас:
- То
BlobForSomeChip
структура имеет 7 бит объявленных. Обычно это было бы 4 байта из-за выравнивания, но с упакованными атрибутами это будет только 1 байт длиной. - А.
unsigned char[4]
не может быть упаковано. Это всегда будет 4 байта длиной, независимо от того, что.
Вкратце:
struct BlobForSomeChip
= 1 байтunsigned char[4]
= 4 байтаBlobData
= 4 байта (его крупнейший размер члена).
Заключение, упакованные атрибуты на BlobData
не требуются. GCC просто будет игнорировать их, если используется - см. Выход с использованием -Wall
.