CodeBlanks Logo Icon CodeBlanks

Interrupt

Interrupt handler yazmayı öğrenirsin.

Interrupt

Bir interrupt (kesme), donanımın CPU'ya bir olay bildirmesidir. CPU, mevcut komutu bırakır, kayıtçıları saklar ve kesme hizmet yordamına (ISR) atlar. ISR bittiğinde CPU önceki işine geri döner.

ISR'ler çok kısa olmalıdır: başka kesmeler gecikebilir, sistem kilitlenebilir. İçinde istisna fırlatılmaz (genellikle -fno-exceptions ile derlenir), heap kullanılmaz, uzun döngü yoktur. Donanım bayrağı temizlenir, ortak değişkene işaret konur, ana döngü işi yapar.

Paylaşılan değişken volatile

ISR ile ana döngü arasında paylaşılan bir değişken volatile olmalıdır. Aksi halde derleyici ana döngüde değişkeni bir kez okuyup önbelleğe alabilir; ISR tarafından değişen yeni değeri görmez.

Örnek: volatile bool flag = false;. ISR flag = true; yapar; ana döngü while (!flag) { } ile bekler. volatile olmadan derleyici flag'i bir kez okur ve döngüyü sonsuz yapar. Bu yüzden ISR ile paylaşılan her değişken volatile olmalıdır.

Uygulama ISR-style volatile değişken kullan

Global volatile bool flag = false; ve volatile int counter = 0; tanımla. main içinde flag = true;, counter = 5; ve std::cout << counter; yaz.

Başlangıç kodu

main.cpp
#include <iostream>

// flag ve counter volatile değişkenlerini buraya tanımla

int main() {
    // flag'i true yap, counter'a 5 ata ve yazdır
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>

volatile bool flag = false;
volatile int counter = 0;

int main() {
    flag = true;
    counter = 5;
    std::cout << counter;
    return 0;
}

Beklenen çıktı

5

Soru ve cevaplar

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

1 Bir ISR genellikle ne yapmaz?

main.cpp
__attribute__((interrupt)) void isr() { /* ... */ }
  • Hızlı dönmek
  • İstisna fırlatmak Doğru cevap
  • Bayrağı temizlemek
  • Donanıma yazmak

Açıklama: ISR'ler istisna fırlatmaz; çünkü istisna tabloları pahalıdır ve geri dönüş karmaşık olur.

2 ISR adını tamamla

Soru
__attribute__((interrupt)) void ____() { /* ISR gövdesi */ }
Cevap
__attribute__((interrupt)) void isr() { /* ISR gövdesi */ }

Açıklama: isr, kesme hizmet yordamının adıdır.

3 Kavramı rolüne eşle

Kavram Anlamı
ISR Kesme hizmet yordamı
volatile Paylaşılan değişken
noexcept İstisna yok
flag Kesme bayrağı

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