Kesme
- C kursu
- Uzman
- Ders 39/47
- 5 dk
Kesme (interrupt) yönetimini öğrenirsin.
Kesme (interrupt) nedir?
Kesme (interrupt), donanımın işlemciyi anında uyarmasıdır. Bir olay olduğunda (zamanlayıcı bitti, buton basıldı), işlemci mevcut işi bırakıp bir kesme hizmet yordamına (ISR, interrupt service routine) atlar.
ISR, kısa ve hızlı olmalıdır: uzun işlemler diğer kesmeleri geciktirir. C'de ISR genellikle void döndüren ve parametre almayan bir fonksiyondur. Gömülü sistemlerde ISR, bir bayrak (flag) ayarlar; ana döngü bu bayrağı kontrol edip asıl işi yapar. Bu desen, ISR'yi kısa tutar. Bayrak her zaman volatile olmalı: hem ISR hem ana döngü ona erişir.
ISR ve bayrak deseni
ISR ve ana döngü arasındaki iletişim bayrak ile yapılır. ISR çağrılınca bayrağı kurar: void irq_handler(void) { irq_flag = 1; }. Ana döngü bayrağı kontrol eder: if (irq_flag) { ... irq_flag = 0; }.
Bayrak sıfırlanmazsa, ISR her çağrıldığında ana döngü tekrar iş yapar. Bu yüzden iş bittikten sonra bayrak temizlenir. Bayrak volatile olmalı: derleyici, ana döngüdeki if (irq_flag) kontrolünü optimize edip kaldırmamalıdır. Bu desen, gömülü C'de kesme yönetiminin temelidir. ISR içinde printf gibi yavaş işlemler yapılmaz; yalnızca bayrak kurulur.
Uygulama Kesme simülasyonu yaz
volatile int irq_flag = 0; tanımla. void irq_handler(void) yaz; içinde irq_flag = 1;. int main(void) içinde irq_handler() çağır, sonra printf("Kesme: %d\n", irq_flag) ile bayrağı yazdır.
Başlangıç kodu
#include <stdio.h>
// volatile bayrak tanımla
// irq_handler fonksiyonu yaz
// main'de çağır ve yazdırÖrnek çözüm
#include <stdio.h>
volatile int irq_flag = 0;
void irq_handler(void) {
irq_flag = 1;
}
int main(void) {
irq_handler();
printf("Kesme: %d\n", irq_flag);
return 0;
}Beklenen çıktı
Kesme: 1
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Kesme kavramını eşle
| Kavram | Anlamı |
|---|---|
Kesme |
Donanım olayı |
ISR |
Hizmet yordamı |
Bayrak |
volatile |
Vektör |
ISR adresi |
2 Kesme bayrağının ilk değerini tamamla
volatile int irq_flag = ____;
volatile int irq_flag = 0;
Açıklama: Bayrak başlangıçta sıfırdır; kesme gelince 1 olur.
3 ISR içinde hangi işlem yapılmamalıdır?
- Bayrak kurma
- Sayaç artırma
- Kayıt okuma
- Uzun printf çağrısı Doğru cevap
Açıklama: ISR kısa olmalı; uzun printf ISR'de yapılmaz.