Elektronik

Gömülü Sistemlerde Kesme (Interrupt) Yönetimi: Neden ve Nasıl?

09 Temmuz 2026 · 4 dk okuma · 2 görüntülenme

Bir mikrodenetleyicinin bir butona basılmasını ya da bir sensörden veri gelmesini nasıl "fark ettiğini" hiç düşündünüz mü? İki temel yaklaşım vardır: polling (yoklama) ve interrupt (kesme). Aradaki fark, hem yazdığınız firmware'in yapısını hem de cihazınızın enerji tüketimini kökten etkiler.

Polling: basit ama pahalı

Polling yaklaşımında, ana döngü sürekli olarak ilgili pini veya register'ı kontrol eder:

while (1) { if (digitalRead(BUTTON_PIN) == LOW) { handleButtonPress(); } }

Bu yöntem anlaşılması kolaydır ama işlemciyi sürekli meşgul eder. İşlemci, olayın gerçekleştiği o anı yakalamak için sonsuz döngüde beklemek zorundadır — bu da hem gereksiz enerji tüketimine hem de aynı anda başka işler yapılmasını zorlaştıran bir yapıya yol açar. Pil ile çalışan bir cihazda, işlemcinin uyku moduna hiç geçememesi, batarya ömrünü ciddi şekilde kısaltır.

Interrupt: donanımın sizi uyandırması

Kesme mekanizmasında ise işlemci, ilgili olay gerçekleşene kadar başka işlerle meşgul olabilir (hatta düşük güç moduna geçebilir). Olay gerçekleştiğinde donanım, işlemcinin çalışmakta olduğu normal akışı keser, kayıtlı bir Interrupt Service Routine'i (ISR) çalıştırır ve iş bittiğinde kaldığı yerden devam eder:

  • Tepki süresi çok daha kısadır — donanım olayı anında yakalar, döngünün bir sonraki iterasyonunu beklemez.
  • Güç tüketimi düşer — işlemci, kesme gelene kadar düşük güç modunda (sleep) bekleyebilir; birçok mikrodenetleyici, belirli kesme kaynaklarının uyku modundan bile çıkış tetikleyebilmesini destekler.
  • Zamanlama hassasiyeti artar — özellikle UART veri alımı, encoder okuma veya hassas zamanlama gerektiren PWM üretimi gibi işlerde kritik önem taşır.

ISR yazarken dikkat edilmesi gerekenler

Kesme rutinleri güçlü bir araçtır ama yanlış kullanıldığında hata ayıklaması en zor buglara yol açar. Deneyimli gömülü sistem geliştiricilerinin uyduğu birkaç temel kural:

  • ISR'ı kısa tutun. Kesme çalışırken (çoğu mimaride) diğer kesmeler bekletilir. ISR içinde uzun hesaplamalar veya gecikme (delay) fonksiyonları çağırmak, sistemin diğer olaylara tepki verme yeteneğini bozar. İyi bir pratik: ISR içinde sadece bir bayrak (flag) set edin veya bir veriyi bir tampona (buffer) yazın; asıl işi ana döngüde yapın.
  • Paylaşılan değişkenleri volatile olarak tanımlayın. Bir ISR içinde değiştirilen ve ana döngüde okunan değişkenler volatile olarak işaretlenmezse, derleyici bu değişkenin değerinin değişmeyeceğini varsayarak optimizasyon yapabilir ve ana döngü asla güncellenmiş değeri göremez.
  • Kesme önceliklerini (priority) doğru yapılandırın. ARM Cortex-M gibi mimarilerde birden fazla kesme kaynağı varsa, hangi kesmenin diğerini kesebileceğini (nested interrupt) doğru planlamak, kritik bir olayın daha az önemli bir kesme tarafından geciktirilmesini önler.
  • Race condition'lara dikkat edin. Ana döngü bir değişkeni okurken tam o sırada bir kesme araya girip aynı değişkeni değiştirirse, tutarsız bir durum oluşabilir. Kritik bölümlerde kesmeleri geçici olarak devre dışı bırakmak (ve mümkün olduğunca kısa tutmak) bu sorunu önler.

Ne zaman polling, ne zaman interrupt?

Bu bir "her zaman interrupt kullan" kuralı değildir. Çok hızlı, sürekli örnekleme gerektiren bazı senaryolarda (örneğin belirli ADC okuma döngüleri) sabit aralıklı polling daha öngörülebilir olabilir. Ama buton okuma, haberleşme hatları (UART/I2C/SPI veri hazır sinyalleri) ve harici sensör olayları gibi "ne zaman olacağı belirsiz" durumlarda interrupt, hem daha verimli hem de daha temiz bir mimari sağlar.

Sonuç

Kesme yönetimini doğru kavramak, bir gömülü sistem geliştiricisinin en temel yetkinliklerinden biridir. Doğru kullanıldığında hem tepki süresini kısaltır hem de enerji verimliliğini artırır — ama ISR'ları şişirmek ya da paylaşılan durumu dikkatsizce yönetmek, projenizin en kararsız buglarının kaynağı olabilir.

#Gömülü Sistemler #Mikrodenetleyici #Interrupt #Firmware #ARM #AVR

İlgili Yazılar