cancel
Showing results for 
Search instead for 
Did you mean: 

how to use the bit fields structure?

monmsn1234
Associate II
Posted on April 06, 2009 at 10:12

how to use the bit fields structure?

12 REPLIES 12
monmsn1234
Associate II

Posted on May 17, 2011 at 13:08

Hi all;

Thanks for your advices. I solved my problem! (I'm using IAR)

I tried to use the two methods proposed by andreas1 and janek. The two methods work as I want. But I think using union is an elegant way to solve the problem. I share it:

typedef union
{
  struct
  {
    u8 a : 1;
    u8 b : 1;
    u8 c : 2;
    u8 d : 3;
    u8 e : 1;
  } fields;
  vu8 REG;
} REG_struct;

REG_struct SPI_DATA;
vu8 var;

SPI_DATA.REG = 0x55;
printf(''sizeof(REG_struct) = % d\n'', sizeof(REG_struct));
printf(''SPI_DATA.REG = 0x % x,
       SPI_DATA.a = 0x % x,
       SPI_DATA.b = 0x % x,
       SPI_DATA.c = 0x % x,
       SPI_DATA.d = 0x % x,
       SPI_DATA.e = 0x % x\n'',
       SPI_DATA.REG,
       SPI_DATA.fields.a,
       SPI_DATA.fields.b,
       SPI_DATA.fields.c,
       SPI_DATA.fields.d,
       SPI_DATA.fields.e);

SPI_DATA.REG = 2;
printf(''SPI_DATA.REG = 0x % x,
       SPI_DATA.a = 0x % x,
       SPI_DATA.b = 0x % x,
       SPI_DATA.c = 0x % x,
       SPI_DATA.d = 0x % x,
       SPI_DATA.e = 0x % x\n'',
       SPI_DATA.REG,
       SPI_DATA.fields.a,
       SPI_DATA.fields.b,
       SPI_DATA.fields.c,
       SPI_DATA.fields.d,
       SPI_DATA.fields.e);

SPI_DATA.fields.a = 1;
SPI_DATA.fields.d = 1;
printf(''SPI_DATA.REG = 0x % x,
       SPI_DATA.a = 0x % x,
       SPI_DATA.b = 0x % x,
       SPI_DATA.c = 0x % x,
       SPI_DATA.d = 0x % x,
       SPI_DATA.e = 0x % x\n'',
       SPI_DATA.REG,
       SPI_DATA.fields.a,
       SPI_DATA.fields.b,
       SPI_DATA.fields.c,
       SPI_DATA.fields.d,
       SPI_DATA.fields.e);

var = SPI_DATA.REG;
printf(''var = 0x % x\n'', var);
SPI_I2S_SendData(SPI1, SPI_DATA.REG);

//////////////////////////////////////////////////

The output of the program is:

sizeof(REG_struct) = 1

SPI_DATA.REG = 0x55, SPI_DATA.a = 0x1, SPI_DATA.b = 0x0, SPI_DATA.c = 0x1, SPI_DATA.d = 0x5, SPI_DATA.e = 0x0

SPI_DATA.REG = 0x2, SPI_DATA.a = 0x0, SPI_DATA.b = 0x1, SPI_DATA.c = 0x0, SPI_DATA.d = 0x0, SPI_DATA.e = 0x0

SPI_DATA.REG = 0x13, SPI_DATA.a = 0x1, SPI_DATA.b = 0x1, SPI_DATA.c = 0x0, SPI_DATA.d = 0x1, SPI_DATA.e = 0x0

var = 0x13

//////////////////////////////////////////////////

 

I'm wondering if using this method is optimized vs using the masks and the shifts (timnig/size)?

cheers

stevemelnikoff9
Associate II
Posted on May 17, 2011 at 13:08

Quote:

I'm wondering if using this method is optimized vs using the masks and the shifts (timnig/size)?

I wouldn't expect to see a lot of difference, but there's only one way to be sure...

st3
Associate II
Posted on May 17, 2011 at 13:08

Quote:

I'm wondering if using this method is optimized vs using the masks and the shifts (timnig/size)?

Quote:

I wouldn't expect to see a lot of difference, but there's only one way to be sure...

I have certainly seen cases where the bitfield implementation was less efficient than just coding the shifts & masks ''manually''! :(

Again: you know exactly where you are with shifts & masks - why introduce any doubt or uncertainty?! :o