Frage

Dieser Code ist für Microchip PIC32MX Mikroprozessor. Ihre Compiler ist im Wesentlichen GCC 3.4.

I Verwendung GCC __packed__ Attribut Bitfelder in einer Union zu packen, und später wieder abrufen sie als unsigned char (dh. Typ-punning) über SPI oder I2C senden. Dieses Verhalten ist alles durch meine Implementierung definiert und funktioniert perfekt. Ich ziehe diese zu hundert oder so Linien der Maskierung und Verschiebung:)

Meine Frage ist: Gibt es __packed__ Attribute in dem folgenden Code, die redundante sind? Auf den ersten Blick würde ich denken, dass mit den auf der obersten Ebene Gewerkschaftsmitglieder verzichtet werden kann, aber ich bin nicht so sicher. Oder kann ich die in der verschachtelten Struktur auslassen?

// 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;
War es hilfreich?

Lösung

Zunächst einmal, empfehle ich mit -Wall kompilieren.

  1. Die BlobForSomeChip Struktur hat 7 Bits erklärt. Normalerweise würde es 4 Bytes lang sein aufgrund Ausrichtung, aber mit gepackten Attributen wird es nur 1 Byte lang sein.
  2. A unsigned char[4] kann nicht verpackt werden. Es wird immer 4 Bytes lang sein, egal was passiert.

Kurz gesagt:

  1. struct BlobForSomeChip = 1 Byte
  2. unsigned char[4] = 4 Bytes
  3. BlobData = 4 Byte (seine größte Mitglied der Größe).

Abschliessend die gepackten Attribute auf BlobData sind nicht erforderlich. GCC wird sie einfach ignorieren, wenn verwendet - vgl. Die Ausgabe -Wall mit

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top