Interrupt Tabanlı UART RX’in Gerçek Sınırları
Birçok gömülü sistem projesinde UART haberleşmesi ilk etapta güvenilir görünür. İlk testlerde veri kaybı gözlenmez, sistem kararlı çalışır ve konu çoğu zaman çözüldü olarak kabul edilir. Ancak baud rate artırıldığında, CPU frekansı düşürüldüğünde veya sistem ek iş yükleriyle karşılaştığında, aynı UART sürücüsünün aniden veri kaybetmeye başladığı görülür.
Çoğu durumda problemin kaynağı UART donanımının kendisi değil, RX tarafındaki yazılım mimarisidir.
Bu yazıda, FIFO veya DMA kullanmadan interrupt tabanlı UART RX yaklaşımının ne kadar güvenli çalışabileceğini; hesaplamalar, pratik örnekler ve profesyonel BSP odaklı bir mühendislik bakış açısıyla ele alıyoruz.
Interrupt Tabanlı UART RX Nasıl Çalışır?
Interrupt tabanlı UART RX modeli yaygın olarak kullanılır ve ilk bakışta oldukça basit görünür:
UART çevre birimi bir bayt alındığında RX interrupt üretir
CPU, interrupt servis rutinine (ISR) girer
ISR içerisinde:
Durum (status) register’ları kontrol edilir
RX veri register’ı okunur
Alınan bayt bir yazılım tamponuna yazılır
Bu yaklaşım düşük ve orta seviyedeki baud rate’lerde genellikle sorunsuz çalışır. Ancak sınırları belirleyen kritik bir nokta vardır:
UART RX performansı, bayt başına ISR çalışma süresi ile temel olarak sınırlıdır.
Her gelen bayt CPU zamanı tüketir. Bu süre uzadıkça veya baytlar daha sık geldikçe, sistem kaçınılmaz olarak performans sınırlarına yaklaşır.
FIFO veya DMA Olmadan Neden Problemler Ortaya Çıkar?
FIFO veya DMA kullanılmadığında, UART RX yolu çok düşük toleransa sahiptir:
UART çevre birimi bayt almaya devam eder
CPU RX interrupt’ını zamanında işleyemezse:
Overrun oluşur
Veri kaybı meydana gelir
Yazılım tarafında bu kayıp çoğu zaman sessizce gerçekleşir
FIFO tamponlama veya DMA ile yük aktarımı olmadan, RX veri yolu tamamen interrupt zamanlamasına bağımlı hale gelir.
Bu durum özellikle şu senaryolarda belirginleşir:
Yüksek baud rate haberleşmeler
Düşük CPU frekansları
Çok görevli veya RTOS tabanlı sistemler
Yoğun interrupt trafiği olan ortamlar
ISR Çalışma Süresi vs Baud Rate – Basit Bir Hesap
Sınırları daha net görmek için basit ama açıklayıcı bir hesaplama yapalım.
Varsayımlar
CPU frekansı: 64 MHz
UART konfigürasyonu: 8N1 (1 bayt = 10 bit)
RX ISR çalışma süresi: 10 µs (fonksiyon çağrıları, bit maskeleme ve yazılım FIFO’ya veri yazımı dahil)
Baud Rate’e Göre Bayt Süresi
| Baud Rate | Time per Byte |
|---|---|
| 115200 | ~87 µs |
| 921600 | ~10.8 µs |
Durum
115200 baud:
ISR süresi: 10 µs
Bayt süresi: 87 µs
CPU’nun diğer işler için yaklaşık 77 µs zamanı var
921600 baud:
ISR süresi: 10 µs
Bayt süresi: 10.8 µs
CPU neredeyse tamamen UART RX işlemiyle meşgul
Bu noktada sistem, kapasitesinin sınırında çalışır. Ek bir gecikme, başka bir interrupt, RTOS context switch’i veya bir cache miss kolayca veri kaybına yol açabilir..
CPU Frekansı Düşürüldüğünde Ne Olur?
Şimdi aynı kodu ve baud rate’i, ancak daha düşük bir CPU frekansı ile düşünelim.
CPU frekansı: 64 MHz → 16 MHz
ISR çalışma süresi yaklaşık 4 kat artar
10 µs → ~40 µs
Sonuç olarak:
115200 baud artık güvenli bir çalışma noktası değildir
921600 baud pratikte kullanılamaz hale gelir
RX overrun’lar daha sık oluşur
Veri kayıpları düzensiz ve debug edilmesi zor hale gelir
Bu da önemli bir mühendislik sonucuna götürür:
Baud rate tek başına anlamlı bir metrik değildir.
CPU frekansı, ISR çalışma süresi ve toplam sistem yükü birlikte değerlendirilmelidir.
UART Polling vs Interrupt vs DMA
Üç yaygın UART RX yaklaşımını kısaca karşılaştıralım:
| Yöntem | CPU Yükü | Yüksek Baud Rate | Güvenilirlik |
|---|---|---|---|
| Polling | Çok yüksek | ❌ | ❌ |
| Interrupt | Orta | ⚠️ | ⚠️ |
| DMA | Düşük | ✅ | ✅ |
- Polling basittir ancak aşırı CPU zamanı tüketir
- Interrupt tabanlı RX dengeli bir çözümdür fakat sınırları nettir
- DMA tabanlı RX yüksek bant genişliği ve deterministik davranış sağlar
Burada yaygın bir yanlış algıyı düzeltmek gerekir:
DMA bir lüks veya optimizasyon değildir — yüksek baud rate’lerde güvenilir haberleşme için bir zorunluluktur.
Profesyonel Bir BSP Perspektifi
Endüstriyel sistemlerde UART sürücüleri hiçbir zaman tek bir kullanım senaryosu için tasarlanmamalıdır. Profesyonel bir BSP mimarisi, aşağıdaki ölçeklenebilir konfigürasyonları desteklemelidir:
Sadece interrupt
Interrupt + FIFO
DMA tabanlı
Bu esneklik sayesinde aynı uygulama kodu:
Farklı MCU’larda
Farklı CPU frekanslarında
Farklı performans ve sistem yükü koşullarında
değişiklik gerektirmeden çalışabilir.
Bu mimari yaklaşım, aynı firmware’in farklı donanım platformlarında tutarsız davranmasına yol açan saha problemlerini önler.
Teoriden Pratiğe: BSP Geliştirme Eğitimi
UART performans sınırlarını teorik olarak anlamak önemlidir, ancak gerçek değer bu kavramların pratikte uygulanmasıyla ortaya çıkar.
Profesyonel BSP geliştirme sürecinde aşağıdaki konular:
Interrupt gecikmesi
ISR çalışma süresi
FIFO derinliği hesaplaması
DMA tabanlı veri akışı
CPU frekansı ölçekleme
yalnızca optimizasyon detayları değil, sistem güvenilirliğini, ölçeklenebilirliği ve uzun vadeli sürdürülebilirliği doğrudan etkileyen mimari kararlardır.
BSP Geliştirme Eğitimimizde bu konular sadece teorik olarak anlatılmaz; gerçek donanım üzerinde uygulanır, ölçülür ve analiz edilir. Katılımcılar, interrupt tabanlı RX ile başlayan UART sürücülerini adım adım geliştirerek FIFO tamponlama ve DMA tabanlı veri aktarımına kadar ilerler.
Eğitim sürecinde, üretici tarafından oluşturulmuş HAL kodlarına veya hazır yapılandırmalara güvenmek yerine şu konulara odaklanılır:
Donanımın gerçek davranışını anlamak
Ölçülebilir kısıtlara dayalı tasarım kararları almak
Farklı MCU aileleri arasında taşınabilir ve ölçeklenebilir BSP katmanları oluşturmak
Bu uygulamalı yaklaşım, mühendislerin “çalışıyor” seviyesinin ötesine geçerek gerçek dünya koşullarında güvenilir kalan haberleşme alt sistemleri tasarlamasını sağlar.
Sonuç
UART haberleşmesi basit görünse de, yüksek performans ve güvenilirlik gerektiren sistemlerde ciddi bir mühendislik problemine dönüşür.
Interrupt tabanlı RX belirli bir noktaya kadar etkilidir
Baud rate arttıkça matematiksel sınırlar ortaya çıkar
CPU frekansı ve ISR çalışma süresi kritik parametrelerdir
Yüksek hız ve deterministik davranış için DMA kaçınılmazdır
Sağlam bir UART tasarımı, ayar değişiklikleriyle değil, doğru mimariyle başlar.