Domanda

Questo codice è per PIC32MX microprocessore di Microchip. Il loro compilatore è essenzialmente GCC 3.4.

Io tendo l'uso di GCC __packed__ attributo per il confezionamento di campi di bit in un'unione, e poi recuperarli come unsigned char (es. tipo-giochi di parole) per l'invio di più di SPI o I2C. Questo comportamento è tutto definito dalla mia realizzazione, e funziona perfettamente. Preferisco questo ad un centinaio di linee di nastro e spostando:)

La mia domanda è: Ci sono gli attributi __packed__ nel codice qui sotto che sono ridondanti? A prima vista, penserei che quelli sui membri del sindacato di livello superiore può fare a meno, ma non sono così sicuro. O posso lasciare fuori quelli della struct nidificato?

// 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;
È stato utile?

Soluzione

Prima di tutto, vi consiglio di compilazione con -Wall.

Ora:

  1. Lo struct BlobForSomeChip ha 7 bit dichiarati. Normalmente, sarebbe lunghezza di 4 byte dovuta all'allineamento, ma con attributi imballati sarà solo 1 byte lungo.
  2. Un unsigned char[4] non può essere imballato. Sarà sempre 4 byte lungo, non importa quale.

In breve:

  1. struct BlobForSomeChip = 1 byte
  2. unsigned char[4] = 4 byte
  3. BlobData = 4 byte (dimensione suo maggiore di utente registrato).

In conclusione, non sono necessari gli attributi imballato su BlobData. GCC semplicemente ignorarli se utilizzato -. Visualizzare l'output utilizzando -Wall

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top