2011-07-18 13 views
8

Me preguntaba si existe una directiva GCC C Compiler que me permita determinar el orden de bits para el embalaje de una estructura. Algo de la talla de:¿Cómo imponer el orden de los bits de estructura con el compilador de GCC?

#pragma bit_order left 

La justificación de tal necesidad es que tengo la siguiente estructura:

struct { 
     union { 
      unsigned char BYTE; 
      struct { 
       unsigned char B0: 1; 
       unsigned char B1: 1; 
       unsigned char B2: 1; 
       unsigned char B3: 1; 
       unsigned char B4: 4; 
      }BIT; 
     }ITEM; 
} myStruct; 

Con esta estructura, me gustaría que el compilador paquete de esta manera:

Bit order: | 7 6 5 4 3 2 1 0 | 
Label:  |B0 B1 B2 B3 B4 B5 B6 B7 | 

en lugar de cómo lo hace GCC:

Bit order: | 7 6 5 4 3 2 1 0 | 
Label:  |B7 B6 B5 B4 B3 B2 B1 B0 | 

Estoy tratando con MCU que tienen enormes archivos de encabezado que tienen estructuras que calculan las compensaciones de bits de acuerdo con las direcciones de hardware estipuladas. Espero que haya una directiva de compilación en GCC C Compiler que haga el intercambio de orden de bits para mí antes de intentar voltear todos los campos en el archivo suministrado por el fabricante.

+0

tamaño y el orden y el compilador superconjunto https://stackoverflow.com/questions/1490092/cc-force-bit-field-order-and-alignment hace 'subconjunto de trabajo packed': https://stackoverflow.com/questions/1756811/does-gccs-attribute-packed-retain-the-original-ordering –

Respuesta

12

¿Qué versión de GCC está usando y qué plataforma? Un pragma existe eso puede hacer el truco, pero no funciona en x86 a partir de GCC 4.

#pragma reverse_bitfields on 

Más detalles en:

http://groups.google.com/group/gnu.gcc.help/browse_thread/thread/747918655affa5c0?pli=1

Si no te importa la reconstrucción de GCC , todas las configuraciones de generación pertinentes están aquí (búsqueda de bitfield):

http://gcc.gnu.org/onlinedocs/gccint/Storage-Layout.html

Algunos detalles acerca bitfields ser malo:

C/C++: Force Bit Field Order and Alignment

+1

Muchas gracias amigo! ¡Eso fue realmente informativo! La rama de la que quitaron el GCC fue la versión 4.3.0. La documentación del compilador GCC C que tengo para ese MCU objetivo es bastante escasa y estoy tratando de sacarle el mejor provecho. Parece que la única salida es reordenar las estructuras yo mismo. Gracias una vez más por ayudarme a agilizar el proceso de llegar a una solución factible :) – Vern

+1

+1 para el enlace de alineamiento y orden de campo Force Bit –

Cuestiones relacionadas