Donanım zamanlama
- C kursu
- Uzman
- Ders 41/47
- 5 dk
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
#include <stdio.h>
// volatile sayaç tanımla
// for döngüsüyle 100 birim bekle
// sayacı yazdırÖrnek çözüm
#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
for (int i = 0; i < ____; i++) { delay_counter++; }
for (int i = 0; i < 100; i++) { delay_counter++; }
Açıklama: 100 tekrar, 100 birim gecikme verir.