İşlemcinin % kaçını kullanıyorum?

Başlatan mistek, 05 Ocak 2015, 21:48:26

mistek

Mikroişlemcide çalışan program yazdım.
Yazdığım program mikroişlemcimi ne kadar meşgul ediyor bunu nasıl tespit ederim?

Kullandığımız bilgisayarlarda Windows Görev yöneticisini açtığımızda CPU kullanım % görülüyor bunun gibi bişey yapıp sürekli izlemek mümkün müdür?

Ne şekilde arama yapmam lazım?
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

mistek

Yok hocam rtos kullanmıyorum. Program arasına bayrak falan koyarak tespit edilir mi?
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

Karamel

hocam mikroc bunu hesaplayabiliyordu. sanirim yanlis hatirlamiyorsam pasta dilimi seklindede microcontrollerin islem gucunun %kacinin kullanildigini soyleyebiliyordu.

mistek

İşte bunu nasıl yaptığını bulmam lazım.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

hasankara

#4
Yaptırdığın tüm işlemlerin aynı anda gecikme zaman dilimlerinde olduğu zamanlarda yada bir şeylerin kendiliğinden olmasını beklediği zamanlarda işlemci tamamen boşta olduğu düşünülür. güç tasarrufu için bu zamanlarda işlemci hızı minimuma düşürülebilir. diğer durumlarda zaten işlemciyi kullanıyorsun demektir. işlemci boşta olduğu zaman ile diğer durumlardaki zamanlar arasında bir zaman oranı kurarak işlemci kullanım yüzdesi elde edebilirsin. tabi gecikmeler timer tabanlı ise durum bu şekilde. olduğu yerde dönmesini sağlayarak bir gecikme elde ediyorsan zaten tüm işlem gücünü kullanıyorsun demektir.

mesaj birleştirme:: 05 Ocak 2015, 22:20:05

karamelin söylediğinin sanırım cpu usage ile alakası yok. yazdığın programın hex karşılığı program hafızasının kaçta kaçını kullanıyor ve ram belleğin kaçta kaçını kullandığını gösteren bir araç olabilir. mplabx kullanıyorsan karamelin bahsettiği bu aracı nasıl kullanacağından bahsedebilirim ama sanırım senin sorun bu değildi.

mistek

Programda herşey kesmeler ile yürüyor. Boş kalan zamanlarda işlemci hızını minimuna alıyorum. İşlemcinin yüksek hızlı çalışmaya başladığı yer ile bittiği yer arasını osiloskopta gözlemledim.

İşlemci 8 bit 16MHz.
85us sürüyor.

Şimdi kimi neye bölmem lazım ki yüzde olarak bişeyler bulabileyim? Aktif süre / Boşta geçen süre ? Birim ne olmalı? Saat ? Saniye? us?
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

hasankara

aktif süre*100/(aktif süre+ boşta geçen süre) bu bir oran aslında üstte de altta da aynı birim değer olduğu için birimler sadeleşmiş olur. pc de gördüğün görev yöneticisinde ki kullanım yüzdesi ile aynı anlamı taşır. windows kurulu bilgisayarlarda saniyede bir yenileniyor bu değer. sende saniyede bir yeni değer oluşturacak isen paydayı direk 1 saniye alabilirsin. 

z

#7
Eğer programın while gibi bir döngü içinde kendi kendini takrarlayıp duruyorsa

While ın en son komutu olarak delay(x); gibi bir komut yaz.

Programın çalışsın bu satıra gelince x mili yada mikro saniye beklesin ve tekrar while'ın ilk satırına dönsün.

x değerini değiştirerek programı işi görebilecek kadar yavaşlat.

Diyelimki x=10 ms yaptın ve program bu haliyle bile işini görüyor.

Bu durumda Delay(x) den önceki kod parçasının ne kadar sürede çalıştığını ölç. Bunu scopla bir pinden çıkacağın 1/0 bilgisinden kolayca öğrenebilirsin.

Diyelimki asıl kodların y mili saniyede çalışıyor.

Şimdi;

P = 100 * Y / (Y+X) olur.

örnek olarak x=10, Y=1 ise

P= 100/11 = 9 yani işlemcini sadece %9 yorarak da bu işi yapabilirsin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mistek

Program kesme gelene kadar yatıyor kesme gelince 85us de işini bitirip yine yatıyor. Boşta geçen süreyi kesme gelene kadar geçen süre olarak aldım.

İşlemci kullanım oranı yaklaşık %35 çıktı.

boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

RaMu

Mcu yu uyku moduna almıyorsan %100 çalışıyor
veya %100 kullanıyor diyebilirsin.

Uykuya giriyorsan
uyuduğu süre ve uyumadığı süreden hesaplarsın.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Karamel

hasan hocam. mikro c ye osc degerini vede osc konfigrasyonlarini girdigimizden. o islemcinin hangi kod blogunda ne kadar vakit kaybedecegini biliyor. soruya yanit olabiliyormu bilmiyorum ama compiler icersinde soyle iki adet tablo var.




hasankara

tablolar güzel ancak konuyla alakası yokmuş dediğim gibi bunlar hangi fonksiyonun ne kadar yer kapladığını ayrıntılı analiz etmek için kullanılabilecek özellikler.

bilgisayar üzerinde söz konusu oranın hesaplanabilmesi için simülasyon yapılması gerekir. bazı rtos araçları, simülasyon yaparken hangi task ta ne kadar vakit harcandığının istatistiklerini çıkartabilme gibi özellikleri olabiliyor. tabi gerçeğe ne kadar yakın olabilir tartışılır.

kullanıcıya bağlı olarak task da harcanan sürenin değişmesi muhtemel bir durum. kullanıcı da işlemci yükünü istediği zaman kontrol etmek isteyebilir özellikle, cpu usage değerinin görüntülenmesi bu ihtiyaca çözüm olabilir.

Karamel

hocam z hocam anlatmis ama ben tam olarak anlayamadim. cok basit bir led yak sondur programimiz olsun. asagidaki gibi.  simdi hesabi nasil yapiyoruz?

int main()
{
      Portlari_init_Et();

      while(1)
      {
          Ledler_Yansin = 1; Delayms(100);
          Ledler_Yansin = 0; Delayms(100);
      }

}

hasankara

#13
konu arm da açılmış ama daha bilindik bir denetlyici olan 16f877 den örnek vereyim. delay içerisinde işlemci boşta kabul edelim. periyodik bir işlem olduğu için zaman ekseninin bir bölümünü ele almamız yeterli olacak. kullanıcıdan bağımsız olarak, cpu usage hesaplanabilecek basit bir örnek.

Ledler_Yansin = 1; burası 2 asm kodu olsun. denetleyici her asm kodu için 200 ns harcasin yani toplamda 2 asm kodu 400 ns harcadı. 100ms de işlemci boşta kaldı.
bu durumda işlemciyi meşgul etme ve işlemci boşta kalma süreleri toplamı olarak bir periyot ne oldu?  100,0004 ms.
peki bir periyot boyunca ne kadar süre işlemciyi meşgul ettik? 0,0004 ms.
bu bilgilerle devam eder isek, bir periyotta ne kadar süre işlemciyi meşgul etmiş olduk? 0,0004/100,0004=0,0000003999984...
bu oranı hep 1 den küçük olur ve biz yüzde hesap yapmak istiyorsak 100 le çarparız.
hesaba göre kabaca işlemcimizi %0,0003999984...... kullanmış olduk. Kabaca dedim çünkü, dallanma komutlarını fln göz ardı ettik.

Tekrar belirteyim delay kısmında başka işlemler yapılabildiği zaman bu hesapların, program yazan kişi için bir değeri olur. ham iş olarak 100,0004 ms içerisinde 100 ms başka işler yaptırabileceğini program yazan kişi bilmiş olur. istatistiksel olarak ledleri yaktırıp söndürme işlemin için bir problem meydana gelmeden, başka herhangi 100 ms ham iş yaptırabileceğini bu hesapla görebilirsin.

tek çekirdekli işlemci söz konusu olduğunda bu söylediğim durum, timer tabanlı gecikmeler kullanılarak olabilmekte. rtos un en büyük getirilerinden birisi de bu gecikme işlemlerini alıştığımız gibi tek satırda yaptırabilmemizi sağlıyor olması diyebiliriz.

not.: düzeltme, birim hesaplama hatası.

Karamel

hocam simdi daha iyi anladim. peki hocam mesela led yak sondur degilde. lcd ye birseyler yazan. butonlari olan. ne bileyim iste buzzer i olan. buton a basinca lcd de yazilar yazan. buzerden ses cikaran bir program yazdik. yani kisaca led yak sondurden daha karmasik. yukaridaki gibi asm kodlarini tek tek sayip hesap yapmamiz neredeyse imkansiz gibi birsey degilmi? boyle durumlarda islemci kullanim yuzdesini nasil hesap edecegiz?

yukaridaki sorudan sonra 2. level bir soru daha sormak istiyorum  ki. hocam diyelim ki yukaridaki donanimimiz var. program calisirken islemci kullanimini olcup ekrana yazdirabilirmiyiz?