avatar_Mucit23

Zaman kontrolü ve Hız

Başlatan Mucit23, 30 Ağustos 2011, 23:26:19

Mucit23

Merhabalar Arkadaşlar.
Uzun zamandır uğraştığım Timer benzeri bir sistem var. Sistemi şimdilik iyi ilerletiyorum yanlız ileriki zamanlar için bazı endişelerim var. Biraz kfamdaki sistemi anlatayım. Şöyleki yaptığım sistemde 30 farklı program girilebiliyor. Yani program dediğim zaman sadece.  Her bir programda  saat ve dakika olarak zaman girlip o zaman geldiğinde bana çıkış vermesi gerekiyor. Tek bir çıkışım var. Yani girilebilecek 30 farklı program sadece tek bir çıkışı aktif ediyor. Aynı çıkışın kapatılması için başka şartlar yerine gelmesi gerekiyor. O önemli değil. Şimdi kullanıcı bu 30 programdan istediğini aktif edip içine zaman dilimi girebiliyor. İster 5. aktif eder, ister 15'i isterse 25'i Burada bi kısıtlama yok. Sadece max. 30 adet program girebiliyor.  her bir programın açık olup olmadığı 30 tane dizi değişkende tutuluyor. Ayrıca her program için saat ve dakika bilgileri yine ayrı 30 adet dizi değişkende tutuluyor. Endişe ettiğim nokta ise şudur. Tüm bu işlemleri çok hızlı bir şekilde yapmam lazım. Çünkü arka planda aksatılmadan yürütülmesi gereken tonla iş var. Bunlardan bazıları anlık olarak RTC den saat okunması, SHT11 sensöründen ısı ve nem okunması, Ayrıca bunların kontrolü yapılması yani ısı ve nem değeri için yarladığım set değerine göre bazı çıkışları aç kapa yapılması, Acil durum alarmının kontrolü, Girilen programların kontrolü ve tüm bunların ekrana yazılması. Şimdi bu işlemleri çok hızlı bir şekilde yapmalıyım. Anlık olarak gerçek zamanlı saniye ekrana yazıldığı için saniyenin aksamaması lazım.

Yapılacak bu kadar işlem var iken program düzeni bence çok önemli bir hal alıyor. Önceki Yaptığım kuluçka makinası için hazırladığım yazılımlardan biliyorum. Çok değil Bazen gerçekten saniyede gecikmeler oluyordu. Bana kalırsa bunun sebebi şundan kaynaklanıyordu. Şimdi onlarda hep şu mantığı kullanmıştım. Sıraysa zamanı oku, sensörleri oku çıkışları kontrol et sonra bunları ekrana yaz. Şimdi burada şyöle bir olasılık var. Diyelimki tüm işlemler 700ms sürüyor. Sırasıyla saati okuyup diğer işlemleri yapıp bilgileri ekrana yazıyoruz. İkinci okumada 1 sn dolmadan tekrar okuma yapıldığı zaman ekrana bilgi yazana kadar tekrar bi 700ms geçiyor ve toplamda 1.4 sn sürüyor işlemler  Bı sırada Saniye değeri değiştiği için okuyup ekrana yazmada biraz gecikme oluyor.. Bu sorun belki zamanın okuyup çıkışta hemen ekrana yazarak bir nezlede olsa çözülüyor ama ben verim alamadım.

Şimdi benim aklıma şöyle birşey geldi.
Normalde hepsini belirli bir sıraya göre yapardım.
Bu sefer bir değişiklik yapıp program ana döngü içerisinde sadece zaman okuma işlemi yapıp eğer sn değeri  değişmiş ise gidip diğer işlemleri yapıp tekrar zaman okuma döngüsüne girsem sanırım bu sefer hiçbir aksaklık yaşanmaz. Siz bu konuda ne dersiniz?

Diğer yandan programın açık olup olmasını bir değişkende tutmamın sebebi kapalı olan programları hiç işleme sokamamak. Bu biraz işlem yükünü azaltabilir.

Bunları anlatmamım sebebi hem benim sistemim hakkında sizlerin fikirlerini almak hemde yazılımcılıkta program düzeni hakkında burada bir tartışma havası yaratmak. Sizlerin fikirleri benim için çok değerli.

Bu arada kullandığım işlemci 18F4620, 20Mhz de çalıştırıyorum. Hafıza ve pin ihtiyacıma göre 18F4685 veya pin yetmezse 18F6527 serisine geçebilirim. Büyük ihtimalde geçerim. Şimdilik pek vktim yok ama ileriki zamanlarda ihtiyaç olursa program hakkında ayrıntı veririm.

Birde Rtos Düşünüyorum. Protona nasıl çalışır çok merak ediyorum...
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

#1
Mucit23,
İki gündür senin mesaj etrafında dolanıp duruyor bir cevap yazayım diyorum ama sürekli aynı mesajı okumama rağmen yazacak bir şey bulamıyorum. Sebebi de sorunun tamamen sanal olarak sorulmuş olması.  Yani sanki ileride muhtemel bir sorun ile karşılaşacaksında bu sorunu nasıl aşarsın şeklinde bir soru sormuşsun. Sözlerimi yanlış anlama bana öyle geliyor yada mesajını tam olarak anlamıyorum.
Bu nedenle cevabımıda bu temel üstüne yazacağım.

RTC (harici saat okuma sistemi) barındıran devrelerde saat değerlerinin mutlaka 1sn den önce okunması gerekir. Yeri gelmişken hemen belirteyim saat değerlerinin 1 sn içinde 100 defa yada daha fazla okunmasıda iyi bir hareket değildir. Sırf bu yüzden bazı projelerimde kesme kullanıp 1sn civarında okuma yapmayı sağlamışımdır. İşlemcinin hızını dikkate alırsanız 1sn (1000 ms ) lik süre içinde neler yapılmazki? . Süre insana çok gelebilir ama sensör okumaları birden fazla ise bu süreyi aşmanız bile mümkündür. Bu nedenle oturup hesap yapmak gerekir. Yapılacak hesap da, bir program çevrimi (döngüsü) içinde hangi işlemler yapılacak ve bu işlemlerin süresi yaklaşık ne kadardır bunu yaklaşık olarak tespit etmeniz gerekir.  Bu hesabı yaptıktan sonra şayet 1000 ms lik süre aşılmaya meyilli ise o zaman,  zaman paylaşımlı işlem yapmakta yarar vardır. Örneğin sıcaklık sensörünü illaki her saniye okumanız gerekmez. Bunun yanı sıra bir başka işleminde her saniye yapılması gerekmiyor ise bir sn de birini diğer sn de diğerini yapmanız işinizi epeyce kolaylaştırır. Bunu basit bir değişken kullanarak yada sn değerinin tek veya çift olma durumuna bakarak halledebilirsin.
Örneğin OKU isimli bir bit değişkeni tut.
OKU=1-OKU şeklinde bir formül uygula, OKU her sn ya bir yada sıfır olur.  Bir olduğu zaman sensörün birini sıfır olduğu zaman diğerini okuyabilirsin.
Yada OKU=SN//2  dersen (Oku byte değişkeni) ve Oku sıfır ise bir sensörü değilse diğer sensörü okursan yine istediğini elde edersin. Hatta bakarsın ilk komutmu daha az yer tutuyor yoksa ikincisimi. Ben olsam daha az yer tutan komutu tercih ederdim. Bunuda derleme sonucunda öğrenmek mümkün elbette.
Alarm ve benzeri uygulamalarda zaman karılaştırması epeyce zaman alan bir işlemdir. Hele seninki gibi 30 farklı program var ise işin dahada zor olacak. Bu nedenle önce saat karşılaştırması yapmak daha sonra dakika ve daha sonra var ise sn karşılaştırması yaparak eşitlik aranmalıdır. Saat karşılaştırması ile bir çok karşılaştırmayı ekarte etmen mümkün olacağı için işlemci daha az yük çeker.
Şimdilik diyeceklerim bu kadar. Çünki ortdada somut bir sorun yok ve muhtemel sorunlar için ancak bu kadar yazabildim.
Kolay gelsin
Ete

Mucit23

Anladım hocam. Dediğinizde haklısınız. Tamamen sanal olarak kendi kafamda sorunlar oluşturdum. Dediğiniz yöntemlerin hepsini denemeyi düşünüyorum. Programı iyileştirmek için  yapabileceğim aklıma birçok yöntem geldi. İleride bu başlık altında sizin fikrini almak istediğim bazı konular daha var ama elimde birazdaha somut birşeyler olması lazım.Mesajınız için teşekkür ederim.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

YARARMAN

Eğer işlerini sırasıyla yapmak istiyorsan ve bu akış süre olarak seni etkiliyorsa;
İlk başta işlem öncelikleri diye bir düzen kur.
Eğer ona rağmen çok önemli işlemler geç kalıyorsa tekrarlamalarda;
Onları while'de aralara serpiştir ki RTOS mantığı da bunun daha karmaşık halidir.
Şuanlık tek çare bu şekilde görünüyor...

Mucit23

RTOS u çok duydum ama mantığını hiç bilmiyorum. Yukarıda bahsi ettiğim konuda bir anlamda yattı.
ROTOS un basic tabanlı dillerde kullanıldığını gördünüzmü hiç. PicBasice uyarlıyabilirmiyiz.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

YARARMAN

Yanlış anlama ancak şimdiye kadar Basic'e hiç yaklaşmadım.
C vazgeçilmezimdir.
Basic'e uyarlanıp uyarlanamayacağını söyleyebilmem için denetleyiciler için olan Basic dilinin sınırlarını bilmem gerekiyor.
Bana ne yapmak istediğini ayrıntılı olarak açıklarsan, ben de sana mantıksal olarak elimden geldiği kadar yardımcı olabilirim.

Mucit23

Yok şimdilik ihtiyacim yok sadece merak ediyorum aradaki farkı
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

YARARMAN

Gerçek RTOS'ta karmaşık olarak kesmeler kullanılıyor.

mierdogan

RTOS iyi güzel hoşta hiç kaynak yok yahu?

Sağlam bi Türkçe kaynak bilen var mı?
"Doğal bir esin arzulu bir isteğe dönüştüğünde, insan hedefine dev adımlarla ulaşır..."

Powered by EzPortal