Bit field nedir? Donanım register'larına erişimde bit field mi yoksa bit maskesi mi kullanılmalı?

Cevap

Bit field, struct üyesine kaç bit ayrılacağını belirtmeyi sağlar:

typedef struct {
    uint32_t enable   : 1;
    uint32_t mode     : 2;
    uint32_t prescale : 4;
    uint32_t reserved : 25;
} ctrl_bits_t;

ctrl_bits_t c = {0};
c.mode = 2;

Okunabilir ve RAM'de bayrakları sıkıştırmak için kullanışlıdır.

Neden register erişiminde risklidir?

C standardı şunları implementation-defined bırakır:

  • Bitlerin sıralanması (LSB'den mi MSB'den mi başlanacağı)
  • Bir alanın word sınırını aşıp aşamayacağı
  • Erişim genişliği: derleyici 32 bitlik register'a 8 bitlik okuma/yazma yapabilir. Bazı çevresel birimler yalnızca word erişimini kabul eder.
  • int tipinde bit field'ın signed olup olmadığı

Ayrıca her alan ataması ayrı bir read-modify-write üretir; birkaç alanı değiştirmek register'a birden çok kez yazmak demektir. Yazınca temizlenen (write-1-to-clear) bayraklarda bu, istemeden başka bayrakları silebilir.

Bit maskesi yaklaşımı

#define CTRL_EN_Pos     0U
#define CTRL_EN         (1UL << CTRL_EN_Pos)
#define CTRL_MODE_Pos   1U
#define CTRL_MODE_Msk   (0x3UL << CTRL_MODE_Pos)

uint32_t r = REG->CTRL;                 /* tek okuma */
r &= ~CTRL_MODE_Msk;
r |= (2UL << CTRL_MODE_Pos) & CTRL_MODE_Msk;
r |= CTRL_EN;
REG->CTRL = r;                          /* tek yazma */

Temel işlemler:

x |=  (1U << n);     /* bit set    */
x &= ~(1U << n);     /* bit clear  */
x ^=  (1U << n);     /* bit toggle */
b  = (x >> n) & 1U;  /* bit test   */

Sonuç

  • Register erişimi: maske + shift (CMSIS da bu yolu kullanır), taşınabilir ve öngörülebilir.
  • RAM'deki dahili bayraklar: bit field kabul edilebilir.
  • Haberleşme verisi: bit field ile değil, açık shift/mask ile paketlenmelidir.
  • Signed tiplerde shift yapmayın; 1U gibi unsigned sabit kullanın (1 << 31 int taşmasıdır).
  1. C dilinde volatile anahtar kelimesi ne işe yarar?OrtaC ProgramlamaEmbedded
  2. Bir yazmaçtaki belirli bir biti set, clear ve toggle eden C kodunu yazın.KolayC ProgramlamaEmbedded
  3. Stack ile heap arasındaki fark nedir? Gömülü sistemlerde dinamik bellek kullanımından neden kaçınılır?OrtaC ProgramlamaEmbedded
  4. Endianness nedir? Little-endian ile big-endian farkı nedir?KolayC ProgramlamaEmbedded
  5. Fonksiyon pointer'ları ve callback tabloları gömülü sistemlerde nasıl kullanılır? Bir state machine örneği verin.OrtaC ProgramlamaEmbedded
  6. Makrolar ile inline fonksiyonlar arasındaki fark nedir? Makroların klasik tuzakları nelerdir?OrtaC ProgramlamaEmbedded

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle