__packed__ atributos redundantes
-
01-10-2019 - |
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;
Solución
En primer lugar, recomiendo compilar con -Wall
.
Ahora:
- 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. - Una
unsigned char[4]
no puede ser embalado. Siempre será de 4 bytes de longitud, no importa qué.
En resumen:
-
struct BlobForSomeChip
= 1 byte -
unsigned char[4]
= 4 bytes -
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