Bitfield în embedded C

Un mod foarte util de a folosi structurile este bitfield-urile. Practic structura statusBitfield8 contine doar un singur byte (8 biți) de informație utilă. Dar fiecare bit poate să însemne orice dorește programatorul. Cea de-a doua structură conține 2 bytes (16 biți). În embedded C se încurajează foarte mult folosirea memoriei foarte rațional pentru a se elimina risipa de informație. Fiecare bit trebuie folosit la maxim. Acest lucru este foarte util în momentul în care avem un microcontroller cu putina memorie.
În programul de mai jos practic folosesc doar 3 bytes de date(24 de biți). Practic folosesc 24 de variabile te tip boolean.

#include "stdio.h"

struct
{
  unsigned char bit0:1;
  unsigned char bit1:1;
  unsigned char bit2:1;
  unsigned char bit3:1;

  unsigned char bit4:1;
  unsigned char bit5:1;
  unsigned char bit6:1;
  unsigned char bit7:1;
} statusBitfield8;

struct
{
  unsigned short bit0:1;
  unsigned short bit1:1;
  unsigned short bit2:1;
  unsigned short bit3:1;

  unsigned short bit4:1;
  unsigned short bit5:1;
  unsigned short bit6:1;
  unsigned short bit7:1;

  unsigned short bit8:1;
  unsigned short bit9:1;
  unsigned short bit10:1;
  unsigned short bit11:1;

  unsigned short bit12:1;
  unsigned short bit13:1;
  unsigned short bit14:1;
  unsigned short bit15:1;
} statusBitfield16;

int main()
{
  printf( "Memory size occupied by statusBitfield8 : %d\n", sizeof(statusBitfield8));
  printf( "Memory size occupied by statusBitfield16 : %d\n", sizeof(statusBitfield16));

  /*Setarea bitilor*/
  statusBitfield8.bit0=1;
  statusBitfield16.bit15=1;
  /*Afisarea structurilor*/
  printf( " statusBitfield8 : %d\n", statusBitfield8);
  printf( " statusBitfield16 : %d\n", statusBitfield16);
  return 0;
}

rezultatul programului este :


D:\MinGW\msys\1.0\home\Florin>bitfield.exe
Memory size occupied by statusBitfield8 : 1
Memory size occupied by statusBitfield16 : 2
statusBitfield8 : 1
statusBitfield16 : 32768