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

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

hasankara

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;


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;


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.


RaMu

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.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Karamel

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?

hasankara

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.

Burak B

#19
RTOS olmadan threding yapmak için protothreads kullanmayı dene. Aşağıdaki linkte konuyla ilgili kodlar ve örnekler mevcut.

http://dunkels.com/adam/pt/
"... a healthy dose of paranoia leads to better systems." Jack Ganssle