Gömülü sistemlerde hepimizin bildiği ya da şuanda öğreneceği üzere hafıza alanlarımız (flash - eprom - ram) oldukça kısıtlıdır. Atmega 328p için 2kb ram alanı var desek ve bunun da ancak 2048 tane harfi ram de barındırabileceği anlamına geldiğini söylesek, belki de şu okumakta olduğunuz metini bile ram de saklayamıyor olacağımızı kolayca tahmin edebiliriz. Bazı durumlarda herhangi bir parametrenin sadece açık ya da kapalı olduğunu tutmak istediğimiz bir değişkene ihtiyacımız olur. Ancak en küçük hafıza birimimiz 8 bit (1byte) olduğundan, 1 byte harcamadan 1 bitlik veriyi bir değişken içerisinde saklayabilmek mümkün değildir. Ancak bu bir byte 'ın geri kalan 7 bitini farklı değişkenler için kullanmamıza olanak tanıyan bit fields dediğimiz bir yapı vardır. Tanımlarken hangi değişken için kaç bitlik alan ayırmak istediğimizi belirtmemiz yeterli, bit ayırma işlemini compiler halleder.
Bir projede parametreleri kaydetmek isteyelim, hatta daha net olarak örneklendirelim, bir televizyon için olsun bu. Parametrelerimiz limitleriyle birlikte şöyle olsun :
- Mevcut kanal : 1-16 (toplam 16 kanal) 4 bit
- Ses seviyesi : 0-15 (toplam 16 seviye) 4 bit
- Otomatik parlaklık : true / false (toplam 2 durum) 1 bit
- Dil seçeneği 1-8 (enum 8 dil) 3 bit
- Kaynak 1-4 (enum AV-SCART-TV) 2 bit
enum languages { Turkish, English, French, Dutch, Spanish, Arabic, Farsi }; enum videoSources { Vga, Tv, Scart }; struct params { // 2 byte yer kaplaması beklenir // 4 bit: kanal verisi 0-15 arasında // 4 bit: ses seviyesi verisi 0-15 arasında // 1 bit: Otomaik parlaklık açık / kapalı // 3 bit: Dil seçimi enum maksimum 8 seçenek // 2 bit: Video kaynağı seçimi // 2 bit: boş unsigned char channel :4, volume :4, autoBrightness :1, language :3, source :2, :2; }; int main() { params TvParams; TvParams.channel = 11; TvParams.volume = 5; TvParams.autoBrightness = false; TvParams.language = Turkish; TvParams.source = Vga; cout << sizeof(TvParams); }
sizeof(TvParams.autoBrightness);