سمات زائدة __packed__
-
01-10-2019 - |
سؤال
هذا الرمز مخصص للمعالجات الدقيقة PIC32MX Microchip. برنامج التحويل البرمجي الخاص بهم هو في الأساس GCC 3.4.
أميل إلى استخدام GCC's __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 بايت بسبب المحاذاة ، ولكن مع سمات مزدحمة ، سيكون طولها بايت واحد فقط. - أ
unsigned char[4]
لا يمكن أن تكون معبأة. سيكون دائما 4 بايت طويلة ، بغض النظر عن ماذا.
بالمختصر:
struct BlobForSomeChip
= 1 بايتunsigned char[4]
= 4 بايتBlobData
= 4 بايت (حجم العضو الأكبر).
الختام ، السمات المعبأة على BlobData
غير مطلوبة. سوف تتجاهلها GCC ببساطة إذا تم استخدامها - راجع الإخراج باستخدام -Wall
.