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.
inttipinde 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;
1Ugibi unsigned sabit kullanın (1 << 31int taşmasıdır).
İlgili C Programlama soruları
- C dilinde volatile anahtar kelimesi ne işe yarar?
- Bir yazmaçtaki belirli bir biti set, clear ve toggle eden C kodunu yazın.
- Stack ile heap arasındaki fark nedir? Gömülü sistemlerde dinamik bellek kullanımından neden kaçınılır?
- Endianness nedir? Little-endian ile big-endian farkı nedir?
- Fonksiyon pointer'ları ve callback tabloları gömülü sistemlerde nasıl kullanılır? Bir state machine örneği verin.
- Makrolar ile inline fonksiyonlar arasındaki fark nedir? Makroların klasik tuzakları nelerdir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.