bit alanları etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
bit alanları etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

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

Türksat Saat Kanalı ve IRIG-B Time Code

Türksat Saat Kanalından Saat Bilgisi Nasıl Alınır? Uyduda kanalları dolaşırken, şu Türksat Saat kanalı hep dikkatimi çekmiştir. Özellikle  S...