Hardware serial buffer taşması?

Endorfin35+

Kayıtsız Üye
Katılım
1 Mayıs 2020
Mesajlar
4,204
Bildiğim kadarı ile uno nano gibi serilerde gelen data için 64byte buffer var. Buffer taştığı durumda ne oluyor.

Bufferdaki verile Fifo veya lifo gibi yer mi değiştiriyor yoksa başka bir şey mi?
 
ATmega328P nin datasheet'ine bakınca, bir receive shift register ve receive buffer register olduğu anlaşılıyor. Bu durumda sadece 1 byte'lık buffer var. Bir byte alındıktan sonra buffer registere aktarılıyor ve sonraki byte'ın alışı başlıyor. Sonraki byte'in alışı tamamlanmadan buffer register'deki değeri okumazsan, sonraki byte üzerine yazılır ve veri kaybı oluşur (overrun)
 
Muhtemelen serial kütüphanesi alışın bitişi için bir kesme tanımlıyor. Bu kesme gelince de buffer register okunup bellekteki daha uzun bir buffer'a aktarılıyor. İşte böyle durumlarda real time programlama işi devreye giriyor. 115200 baud iletişim hızında her 877 μs de bir byte gelecek. Kesmenin bu zaman dahilinde çağrılması lazım. Çağrıldıktan sonra da bu süre dolmadan buffer registerini okumuş olması lazım. Eğer bu garantiler sağlanamazsa seri iletişimde veri kaybı kaçınılmaz olacak.

Mesela diyelim dikkatsiz davrandın ve ana programın bir yerinde kritik bir işin var ve kesmeleri 2 ms süreliğine kapattın. O arada gelen serial receive kesmesini kaçırmış olacaksın. Veya kesme fonksiyonunu verimsiz yazdın ve çok fazla zaman yiyor. Bu durumda da zamanında receive buffer registeri okuyamamış olacaksın. Veya farklı önceliklere sahip birçok kesme aynı anda aktif. İşlemci serial receive kesmesine girdi, ama tam buffer registeri okuyacak iken daha yüksek önceliğe (priority) sahip bir kesme geldi. O kesme tamamlandığında senin kesmeye geri dönüldü, ama fazla zaman geçti ve gene receive buffer registeri zamanında okuyamadın. Bunun gibi birçok farklı senaryo da düşünülebilir. Bu tip durumların hepsini öngörüp tedbir alman lazım.

Zaten Windows kullananlar bunu çok yakınen her gün yaşıyor. bir bakıyorsun, fare takılmış, harddisk harıl harıl kaşıyor ... Bir süre sonra fare serbest bırakılıyor ve tekrar kontrol sana geçiyor. Windows her gün sana "real time operating system" olmadığını hatırlatıyor :)
 
"real time operating system" olarak hangi işletim sistemleri uygundur? Linux ?
Eski bilgisayara kurulum yapmak istersek?
 
115200 baud iletişim hızında her 877 μs de bir byte gelecek
Arduino framework ile bir şeyler yazıyorum. Veri akışı tamamlanmadan okuma yapmaya kalkınca paketi eksik alma gibi sorunlar yaşadım. baudrate ile delay hesaplayarak okuma işlemini yavaşlattım ve sorun çözüldü. İlk sorun için arduinonun kütüphanesi nasıl çalışıyor ona bakacağım.

Veya kesme fonksiyonunu verimsiz yazdın ve çok fazla zaman yiyor. Bu durumda da zamanında receive buffer registeri okuyamamış olacaksın. Veya farklı önceliklere sahip birçok kesme aynı anda aktif.

Burada kafam karıştı. Led gibi elemanların yanıp sönmesi için timer kesmesi kullanıyorum. Bu durumda serial buffer birşeyleri kaçırabilir mi?
 
"real time operating system" olarak hangi işletim sistemleri uygundur? Linux ?
Eski bilgisayara kurulum yapmak istersek?

RTLinux var. Ama bu varolan bir Linux'u sonradan zorlama ile real time yapmaya çalışıyor, yoksa tasarım olarak sıfırdan real time yazılmış bir yapı değil. Zaten RTOS işi de kolay birşey değil. Sen çekirdeği RT olarak yazmışsındır, sorunsuz da çalışıyordur. Ama birisi bir driver yazar ve driver interrupt'ları uzunca bir süre kapattı mı bütün RT çöpe gider. Ben şahsen hard real time gerektiği zaman bir RTOS'a güvenmektense bir firmware yazmayı tercih ederim.
 
Led gibi elemanların yanıp sönmesi için timer kesmesi kullanıyorum. Bu durumda serial buffer birşeyleri kaçırabilir mi?

Önceliklendirilmiş kesme yapısı var mı ATmega328P de bilmiyorum şu anda. Eğer varsa, USART kesmesinin önceliğini LED kesmesinden fazla yaparsan sorun çıkmaz. Ama önceliklendirme yoksa, o zaman işlemci kesmeleri sıraya koyar. Birisi bitmeden diğer kesme servis edilemez. Bu durumda LED kesmesinde fazla uzun süre oyalanırsan UART'dan veri kaçırabilirsin.
 
Verileri paket olarak tek seferde okumak yerine tek tek alırsanız daha iyi olabilir. Birde ring buffer algoritması var onu araştırabilirsiniz.
 
Benim çalıştığım işletmede bu durum şöyle çözüme kavuştu.

El sıkışıyor alıcı verici.
Verici mcuya bişey diyeceğim sana diye sesleniyor mcu söyle diyene kadar söylemeye başlamıyor.

mcu söyledim derken kesilmiş veri bekliyor duruma geçiyor bunun üstüne crc+tersine mühendisliğin önüne geçmek için rolling bir yapıdan ortaya çıkan değeride basıyor seri hatta alıcı eğer bir sakatlık algılarsa rolling kısmında mcu lock bitini set ediyor cihaz artık çalışmıyor servis gelmesi lazım
 
Verileri paket olarak tek seferde okumak yerine tek tek alırsanız daha iyi olabilir. Birde ring buffer algoritması var onu araştırabilirsiniz.
Ring mantığı güzelmiş. Bufferı çok sık kontrol ettiğim için şimdilik algoritmam iyi çalışıyor. Ağdaki cihaz sayısını artırıp test edeceğim sorun çıkarsa ring olayına girerim. Şimdilik tamam gibi.
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
5,900
Mesajlar
100,734
Üyeler
2,498
Son üye
TaKo

Son kaynaklar

Son profil mesajları

Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
Back
Top