C
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.
Örnek çözümü göster
#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;
}
Kendini test et
-
Zamanlama yöntemini eşle
- Meşgul bekleme
- For döngüsü
- Zamanlayıcı
- Donanım sayacı
- Kesme
- Belirli süre sonra
- Uyku modu
- Güç tasarrufu
-
Meşgul beklemede sayaç neden volatile olmalı?
- Derleyici döngüyü silmesin diye
- İş parçacığı güvenliği için
- Bellek tasarrufu için
- Hız artışı için
Cevabı göster
Derleyici döngüyü silmesin diye — volatile olmadan derleyici döngüyü optimize edip kaldırabilir.
-
Gecikme döngüsü sınırını tamamla
for (int i = 0; i < ____; i++) { delay_counter++; }
Cevabı göster
for (int i = 0; i < 100; i++) { delay_counter++; }
Sıradaki ders: Özet - Gömülü C