CodeBlanks Logo Icon CodeBlanks

Bellek eşlemeli I/O

Bellek eşlemeli I/O kavramını öğrenirsin.

Bellek eşlemeli I/O

Bellek eşlemeli I/O (memory-mapped I/O, MMIO), donanım yazmaçlarının (register) bellek adreslerine eşlenmesi yöntemidir. Bir GPIO pini, bellekte belirli bir adrese karşılık gelir; o adrese yazmak pini değiştirir, okumak pin durumunu verir.

C'de bu, bir gösterge (pointer) aracılığıyla yapılır: volatile unsigned int *reg = (volatile unsigned int *)0x40021000;. volatile anahtar sözcüğü kritiktir: derleyiciye bu değişkenin optimize edilmemesini söyler. Çünkü donanım her an değeri değiştirebilir; önbelleğe alma (caching) yanlış sonuç verir. MMIO, gömülü C'nin en temel donanım erişim yöntemidir.

volatile neden önemli?

volatile olmadan, derleyici bir yazmaç okumasını önbelleğe alabilir. Örneğin, while (*reg & 1) döngüsünde derleyici *reg'i bir kez okuyup değeri saklayabilir; donanım yazmacı değişse bile döngü sonsuza kadar döner.

volatile ile, derleyici her döngüde yazmacı yeniden okur. Bu, kesme bayrakları ve donanım durum yazmaçları için zorunludur. Gömülü C'de her donanım yazmacı volatile olarak bildirilir. Bu, yazılımın donanım değişikliklerini her zaman görmesini sağlar. Unutma: volatile iş parçacığı güvenliği sağlamaz; yalnızca optimize etmeyi engeller.

Uygulama GPIO yazmacını simüle et

static volatile unsigned int gpio_data = 0; tanımla (sahte yazmaç). int main(void) içinde gpio_data = 1; ile yazmaca yaz. printf("GPIO: %d\n", gpio_data) ile oku ve yazdır.

Başlangıç kodu

main.c
#include <stdio.h>

// sahte GPIO yazmacı tanımla (volatile)
// main'de yazmaca yaz ve oku

Örnek çözüm

main.c
#include <stdio.h>

static volatile unsigned int gpio_data = 0;

int main(void) {
    gpio_data = 1;
    printf("GPIO: %d\n", gpio_data);
    return 0;
}

Beklenen çıktı

GPIO: 1

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 volatile anahtar sözcüğünü tamamla

Soru
____ unsigned int gpio_data = 0;
Cevap
volatile unsigned int gpio_data = 0;

Açıklama: volatile, derleyici optimize etmesin diye kullanılır.

2 Bir donanım yazmacı hangi niteleyiciyle bildirilir?

  • static
  • const
  • volatile Doğru cevap
  • auto

Açıklama: volatile, donanım yazmaçları için zorunludur.

3 MMIO kavramını eşle

Kavram Anlamı
volatile Optimize etme
Yazmaç Donanım adresi
Gösterge Adrese erişim
MMIO Bellek eşlemeli I/O

Uzman bölümündeki tüm dersler