Hardware serial buffer taşması?

Endorfin35+

Kayıtsız Üye
Katılım
1 Mayıs 2020
Mesajlar
4,409
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
6,952
Mesajlar
118,759
Üyeler
2,824
Son üye
selocan32

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
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?
Back
Top