Bitfields

Los bitfields son una construcción muy interesante; permiten guardar la cantidad mínima indispensable de bits para un conjunto de variables. sin embargo, no existe un estándard de cómo debe manejarlos el compilador.

Por ejemplo, consideremos un registro de un micro o DSP de 8 bits:
+---+---+---+----+--+---+---+---+
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+---+---+---+----+--+---+---+---+
|  Rsv  |  cConfig  | Chann | R |
+-------+-----------+-------+---+

Como puede verse, cConfig sólo utiliza 3 bits; y Chann utiliza 2 bits; pero ésto puede generarnos problemas al codificarlo en C. empecemos por declarar una estructura de bitfields:

typedef struct sConfReg {     int R :1;     intChann :2;     int cConfig :3;     int Rsv :2;     int Filler :24; } sConfReg;

Hay 2 cosas que notar aquí:
  1. Estoy utilizando un relleno (Filler) de 24 bits; esto es para que mi procesador de 32-bits (una PC) pueda alinear correctamente. Pero habría que cambiarlo (o quitarlo por completo) dependiendo de la plataforma.
  2. Estoy declarando los campos en modo little-endian; es decir que primero declaro el campo menos significativo.
Sin embargo, como dije al principio, no todos los compiladores lo van a interpretar de la misma manera. Es probable que algunos compiladores requieran que se declaren como big-endian.

Podemos hacer pruebas con diferentes compiladores y procesadores para ver los resultados que arrojan. Bastaría una prueba como la siguiente:


int main() {     sConfReg ConfigurationRegister;     char i=0,j=0;
    // Inicializo valores reservados..     ConfigurationRegister.R=0;     ConfigurationRegister.Rsv=0;     ConfigurationRegister.Filler=0;
    ConfigurationRegister.Chann=1; // 00 000 01 0 = 0x02     ConfigurationRegister.cConfig=7; // 00 111 01 0 = 0x3a     printf("size: %d\n", sizeof(ConfigurationRegister));
    for(i=0;i<4;i++) {         ConfigurationRegister.Chann=i;         printf("ConfigReg: %02x\n", ConfigurationRegister);     }     return 1; }
Con esto podemos comprobar si la alineación y el ancho de palabra son como, según nosotros, lo estamos especificando.

¿Es recomendable utilizar bitfields?
Depende.

Si tus requerimientos exigen optimizar a tal grado, probablemente si.
Si el código va a utilizarse con diferentes compiladores o en diferentes plataformas, probablemente no.

[Regresar]

Comments