CodeBlanks Logo Icon CodeBlanks

Donanım zamanlama

Donanım zamanlama ve gecikme desenlerini öğrenirsin.

Donanım zamanlama

Gömülü sistemlerde zamanlama kritiktir. Bir LED'i belirli aralıklarla yakmak, bir sensörü belli sürede bir okumak için gecikme (delay) gerekir. En basit yöntem, meşgul bekleme (busy-wait) döngüsüdür.

Meşgul bekleme: for (volatile int i = 0; i < 100000; i++);. Burada volatile derleyicinin döngüyü optimize edip kaldırmasını engeller. Bu yöntem basit ama verimsizdir: işlemci sürekli çalışır, güç tüketir. Daha iyi yöntem, donanım zamanlayıcısı (timer) ve kesme kullanmaktır. Zamanlayıcı, belirli bir süre sonra kesme üretir; işlemci uyku moduna geçebilir. Ama basit görevler için meşgul bekleme yeterlidir.

Zamanlayıcı ve kesme

Daha verimli zamanlama için donanım zamanlayıcısı (timer) kullanılır. Zamanlayıcı, işlemciclk frekansına göre sayar; belirli bir değere ulaşınca kesme üretir. ISR'de sayaç sıfırlanır ve bayrak kurulur.

Ana döngü bayrağı kontrol eder: while (1) { if (timer_flag) { timer_flag = 0; ... } }. İşlemci, bayrak beklerken uyku moduna geçebilir; bu güç tüketimini büyük ölçüde azaltır. Pil destekli gömülü sistemlerde bu kritiktir. Zamanlayıcı, gömülü C'den bağımsız bir donanım birimidir; yazılım onu yazmaçlarla yapılandırır. MMIO ve bit manipülasyonu burada birleşir.

Uygulama Gecikme döngüsü yaz

volatile int delay_counter = 0; tanımla. int main(void) içinde for (int i = 0; i < 100; i++) { delay_counter++; } döngüsüyle 100 birim bekle. printf("Gecikme: %d\n", delay_counter) ile sayacı yazdır.

Başlangıç kodu

main.c
#include <stdio.h>

// volatile sayaç tanımla
// for döngüsüyle 100 birim bekle
// sayacı yazdır

Örnek çözüm

main.c
#include <stdio.h>

int main(void) {
    volatile int delay_counter = 0;
    for (int i = 0; i < 100; i++) {
        delay_counter++;
    }
    printf("Gecikme: %d\n", delay_counter);
    return 0;
}

Beklenen çıktı

Gecikme: 100

Soru ve cevaplar

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

1 Zamanlama yöntemini eşle

Kavram Anlamı
Meşgul bekleme For döngüsü
Zamanlayıcı Donanım sayacı
Kesme Belirli süre sonra
Uyku modu Güç tasarrufu

2 Meşgul beklemede sayaç neden volatile olmalı?

  • Derleyici döngüyü silmesin diye Doğru cevap
  • İş parçacığı güvenliği için
  • Bellek tasarrufu için
  • Hız artışı için

Açıklama: volatile olmadan derleyici döngüyü optimize edip kaldırabilir.

3 Gecikme döngüsü sınırını tamamla

Soru
for (int i = 0; i < ____; i++) { delay_counter++; }
Cevap
for (int i = 0; i < 100; i++) { delay_counter++; }

Açıklama: 100 tekrar, 100 birim gecikme verir.

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