Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: mistek - 05 Ocak 2015, 21:48:26

Başlık: İşlemcinin % kaçını kullanıyorum?
Gönderen: mistek - 05 Ocak 2015, 21:48:26
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?
Başlık: Ynt: İşlemcinin % kaçını kullanıyorum?
Gönderen: mistek - 05 Ocak 2015, 21:53:49
Yok hocam rtos kullanmıyorum. Program arasına bayrak falan koyarak tespit edilir mi?
Başlık: Ynt: İşlemcinin % kaçını kullanıyorum?
Gönderen: Karamel - 05 Ocak 2015, 22:00:34
hocam mikroc bunu hesaplayabiliyordu. sanirim yanlis hatirlamiyorsam pasta dilimi seklindede microcontrollerin islem gucunun %kacinin kullanildigini soyleyebiliyordu.
Başlık: Ynt: İşlemcinin % kaçını kullanıyorum?
Gönderen: mistek - 05 Ocak 2015, 22:09:31
İşte bunu nasıl yaptığını bulmam lazım.
Başlık: Ynt: İşlemcinin % kaçını kullanıyorum?
Gönderen: hasankara - 05 Ocak 2015, 22:17:02
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.
Başlık: Ynt: İşlemcinin % kaçını kullanıyorum?
Gönderen: mistek - 05 Ocak 2015, 22:23:37
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?
Başlık: Ynt: İşlemcinin % kaçını kullanıyorum?
Gönderen: hasankara - 05 Ocak 2015, 22:37:06
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. 
Başlık: Ynt: İşlemcinin % kaçını kullanıyorum?
Gönderen: z - 05 Ocak 2015, 22:59:52
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.
Başlık: Ynt: İşlemcinin % kaçını kullanıyorum?
Gönderen: mistek - 05 Ocak 2015, 23:23:49
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ı.

Başlık: Ynt: İşlemcinin % kaçını kullanıyorum?
Gönderen: RaMu - 06 Ocak 2015, 01:01:14
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.
Başlık: Ynt: İşlemcinin % kaçını kullanıyorum?
Gönderen: Karamel - 06 Ocak 2015, 01:51:57
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.

(http://i.hizliresim.com/5ogL6A.png) (http://hizliresim.com/5ogL6A)

(http://i.hizliresim.com/W60gLE.png) (http://hizliresim.com/W60gLE)
Başlık: Ynt: İşlemcinin % kaçını kullanıyorum?
Gönderen: hasankara - 06 Ocak 2015, 02:32:17
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.
Başlık: Ynt: İşlemcinin % kaçını kullanıyorum?
Gönderen: Karamel - 06 Ocak 2015, 02:58:46
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);
      }

}
Başlık: Ynt: İşlemcinin % kaçını kullanıyorum?
Gönderen: hasankara - 06 Ocak 2015, 03:34:01
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ı.
Başlık: Ynt: İşlemcinin % kaçını kullanıyorum?
Gönderen: Karamel - 06 Ocak 2015, 04:11:42
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?
Başlık: Ynt: İşlemcinin % kaçını kullanıyorum?
Gönderen: hasankara - 06 Ocak 2015, 05:33:18
elbette yapabilirsin. bunun için tasklarının meşgul veya bekleme durumunda olup olmadığını izleyebilmek gerekebilir. bizim böyle bir alt yapımızın olduğunu varsayarak devam edeyim.

örnek olarak, tüm task ların ortak olarak gecikme bölümüne girdi bu durumda işlemci boşta kabul edilebilir bu süre zarfınca idle sayacın artmaya başlasın. tasklarından en az bir tanesi bile ham iş yapmaya başladığı zaman süresince cpu kullanılmaya başlandığı kabul edilsin ve bu süre zarfında da busy sayacı  artsın. 1 sn sonunda idle sayacın ne kadar dolmuş busy sayacın ne kadar dolmuş onlara bakarak cpu usage hesaplamasını yapabilirsin.

verdiğin örneği düşünecek olursak;
(http://s2.postimg.cc/5ekpx3d3p/tasking.jpg) (http://postimg.cc/image/5ekpx3d3p/)

t nin birimi milisaniye olsun. 100 milisaniye gecikmeyle buton kontrol edilme işlemi yapılsın (buton için  20 ms gibi astronomik bir ham işlem süresi vermişim de, sen kabaca bir task gibi düşün). butona basıldığında da buzzer ile lcd aynı anda 240. milisaniyede çalışmaya başlamış. 260. milisaniyeye kadar buzzer ile lcd birlikte çalışmışlar ve rtos umuz homojen iş yükü olması için sırasıyla tasklar arasında ara ara geçişler yapmış. belkide buzzer tek başına çalışsaydı 10 milisaniye sonunda bitmiş olacaktı ancak lcd ham iş yükü de bindirince ara ara kesilmeler olmuş. bu durum bazen istenmeyen durum olabilir. hatta buzzer kritik bir işlem olup 10 milisaniyenin sonunda bitirmek zorunda kalırsan eğer bu durumda lcd i daha geç çalıştırmak gibi çözümler düşünmen gerekebilir.

asıl problemimize gelecek olur isek; 220-370 arasındaki süre diliminde cpu usage %100 olmuş. Bu kullanıcı butona bastı diye böyle olmuş hal bu ki kullanıcı butona hiç basmasaydı periyodik olarak sadece buton kontrol etme işlemi yapılacaktı yani 20/120= %16,6 olacaktı.

peki 1 saniye içerisinde cpu usage hesaplayan bir sistem olsaydı ve 1 saniye içerisinde bir kez butona basılsaydı ne olurdu?

bir saniye için devamındaki zaman dilimini de gösterelim;
(http://s17.postimg.cc/mylpg49zf/tasking.jpg) (http://postimg.cc/image/mylpg49zf/)

370 e kadar busy sayacımız kaç ms dolmuş? toplam 170 ms.
370 e kadar idle sayacımız kaç ms dolmuş? toplam 200 ms.
370-1000 arası busy sayacımız kaç ms dolmuş? toplam 100 ms.
370-1000 arası idle sayacımız kaç ms dolmuş? toplam 530 ms.

0-1000 arası busy sayacımız kaç ms dolmuş? toplam 270 ms.
0-1000 arası idle sayacımız kaç ms dolmuş? toplam 730 ms.

cpu usage= 270*100/1000 = %27 olarak buluruz.

Başlık: Ynt: İşlemcinin % kaçını kullanıyorum?
Gönderen: RaMu - 06 Ocak 2015, 05:37:10
Alıntı yapılan: Karamel - 06 Ocak 2015, 02:58:46
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);
      }

}


Bu yazdığın programda
işlemci herzaman %100 çalışıyor durumda.

Eğer delay fonksiyonunu kesme ile halleder ve aynı zamanda
delay fonksiyonununda mcu yu uyutursan
işlemci kullanma yüzden değişir.

Aslında mcu için işlemci ya kullanılmaktadır yada kullanılmamaktadır
ya herhangibir komutu işliyorsundur yada uyku modundasındır.

Ayrıca işlemci kullanımının bir önemide yoktur
(bir durum hariç)
çünkü işler mcu da pc deki gibi değil,
mcuda programı yazarsın ve ne yazdıysan o şekilde çalışır
herşey aslında bellidir,
ama pcde aslında bir işletim sistemi üzerinde çalışan
farklı farklı programların olur ve
bence aslında pcdeki durum şöyle düşünülebilir
benim işletim sistemim şu anda açmış olduğum programı çalıştırdığında
sistemimin ne kadarını bu iş için kullanıyor
tabiki işin aslı bu olmayabilir
net bilmediğim için fazla atıp tutmak istemiyorum ama
misal pcde işlemci çalışma frekansını bile değiştirebilir
çok çekirdek vardır
veya cpu kullanımı gerçekte nedir
yani benim açımdan pc tarafında durum karışık ama
mcu için olay gayet açık ya %100 ya %0 ya komut işliyorsun yada uykudasın
peki
mcu için önemi yok ama bir durum hariç demiştim
o durumda şu
enerji tüketimi
eğer pilli bir uygulama yapıyorsan mcu bir iş yapması gerekmiyorsa uyutmak zorundasın.
Başlık: Ynt: İşlemcinin % kaçını kullanıyorum?
Gönderen: Karamel - 06 Ocak 2015, 06:12:50
hasan hocam. dimdi taslar biraz daha yerine oturdu ama anlamadigim birsey var. diyelimki sistemimizde rtos yok. o zaman nasil yapacagiz?

birde hocam sizce rtos hangi uygulamalar icin kullanilmalidir?
Başlık: Ynt: İşlemcinin % kaçını kullanıyorum?
Gönderen: hasankara - 06 Ocak 2015, 06:52:26
sisteminde rtos yoksa rtosun bu işlevlerini kendin yaptıracak şekilde program yazabilirsin. yada mistek gibi daha basit yaklaşıp her şeyini kesmeye bağlayabilirsin. tabi ki bu, rtos la kıyaslanamayacak kadar ilkel bir yapı sayılabilir.

bu derin bir konu pat diye nasıl anlatayım. ama anahtar kelimelerin real time multithreading olacak şekilde araştırma yapabilirsin. yaklaşık 2 sene önce kadar bu konuda bir şeyler karalamıştım sayfamda hala duruyor o yazılara da bakabilirsin. Bu konuda yayınlamayı düşündüğüm bir kütüphane üzerinde, benim için uzun sayılabilecek bir süredir çalışıyorum. yeterli pişkinliğe ulaşmasını bekliyorum. yayınladıktan sonra artık açık kaynak olarak gönüllülerle birlikte geliştirmeye devam ederiz.
Başlık: Ynt: İşlemcinin % kaçını kullanıyorum?
Gönderen: Burak B - 06 Ocak 2015, 09:26:35
RTOS olmadan threding yapmak için protothreads kullanmayı dene. Aşağıdaki linkte konuyla ilgili kodlar ve örnekler mevcut.

http://dunkels.com/adam/pt/ (http://dunkels.com/adam/pt/)