Pregunta

Este código es para el microprocesador PIC32MX de Microchip. Su compilador es esencialmente GCC 3.4.

tiendo el uso de GCC __packed__ atributo para empacar campos de bits en una unión, y posteriormente recuperarlos como unsigned char (es decir. tipo-juegos de palabras) para el envío de más de SPI o I2C. Este comportamiento es todo lo definido por mi aplicación, y funciona perfectamente. Yo prefiero a un centenar de líneas de cinta y el cambio:)

Mi pregunta es: ¿Hay atributos __packed__ en el código de abajo que son redundantes? A primera vista, yo creo que los de los miembros del sindicato de nivel superior se puede prescindir, pero no estoy tan seguro. O puedo dejar de lado los de la estructura anidada?

// 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;
¿Fue útil?

Solución

En primer lugar, recomiendo compilar con -Wall.

Ahora:

  1. El struct BlobForSomeChip tiene 7 bits declarados. Normalmente, sería 4 bytes de longitud debido a la alineación, pero con atributos envasados ??será sólo 1 byte de longitud.
  2. Una unsigned char[4] no puede ser embalado. Siempre será de 4 bytes de longitud, no importa qué.

En resumen:

  1. struct BlobForSomeChip = 1 byte
  2. unsigned char[4] = 4 bytes
  3. BlobData = 4 bytes (tamaño de su miembro más grande).

En conclusión, no se requieren los atributos envasados ??en BlobData. GCC simplemente ignorarlos si se utiliza -. Ver la salida usando -Wall

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top