سؤال

هذا الرمز مخصص للمعالجات الدقيقة 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.

حاليا:

  1. ال BlobForSomeChip الهيكل لديه 7 بت أعلن. عادة ، سيكون طوله 4 بايت بسبب المحاذاة ، ولكن مع سمات مزدحمة ، سيكون طولها بايت واحد فقط.
  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