C++ Dersleri | Bit Alanları - Gömülü Sistemler Bellek Organizasyonu

    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.

    

C++ bit fields

    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
parametreler çoğaltılabilir.


Kodumuz şöyle olacak

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);
}

Her bir türü için örnek vermeye çalıştım, sonraki parametreye dikkat ederseniz isim vermedik, kullanmıyoruz ama sen bunun 2 bit olduğunu bil ve bize toplamda 16 bit 2 bytelık bellek ayır demiş olduk.
    Uygulama bize 2 çıktısını verdi, beklediğimiz gibi. Ancak sizeof kullanırken şunu yapamıyoruz :

sizeof(TvParams.autoBrightness);

    Herkese kolay gelsin

Önceki konu : Bit kopyalama
Sonraki konu: C++ Diziler

Yorumlar

Bu blogdaki popüler yayınlar

Arduino IDE Kod Satır Numaraları Nasıl Açılır

DMD2TUR | Arduino P10 Led Panel için Türkçe Karakter Desteği | Arduino P10 Led panel Türkçe yazı yazma

P10 Led Panel Nasıl Sürülür - Arduino kod