Main loop süresi

Başlatan robikod, 03 Eylül 2020, 11:44:10

robikod

168Mhz ile çalışan bir işlemcide 1 while loop cycle kaç mili saniye sürer ?

RaMu

#1
Hangi while döngüsü olduğuna göre değişir.

Döngü içinde bir işlem var mı,
işlemci veya mcu mimarisi ne,
derleyici döngüyü asm koduna dönüştürdüğünde ne yapmış.

Döngü boş ise derleyici optimize edip kod üretmeyebilir.
Üretsede en büyük ihtimalle boş bir sorgusuz while döngüsü
Goto bulunduğun satır (yani while (1); )
şeklinde bir komut veya
Goto şu satır şeklinde bir satır goto asm komutu üretir.
Buda işlemci mimarisine göre en fazla (1 / mcu çalışma frekansı Hz) * 4 saniye zaman demek
yani MHz seviyesinde çalışan bir işlemci için mikrosaniye veya altı bir zaman.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

robikod

Alıntı yapılan: RaMu - 03 Eylül 2020, 12:05:42Hangi while döngüsü olduğuna göre değişir.

Döngü içinde bir işlem var mı,
işlemci veya mcu mimarisi ne,
derleyici döngüyü asm koduna dönüştürdüğünde ne yapmış.

Döngü boş ise derleyici optimize edip kod üretmeyebilir.
Üretsede en büyük ihtimalle boş bir sorgusuz while döngüsü
Goto bulunduğun satır (yani while (1); )
şeklinde bir komut veya
Goto şu satır şeklinde bir satır goto asm komutu üretir.
Buda işlemci mimarisine göre en fazla (1 / mcu çalışma frekansı Hz) * 4 saniye zaman demek
yani MHz seviyesinde çalışan bir işlemci için mikrosaniye veya altı bir zaman.

while(1){
1==1;
}

şeklinde bir kod olduğunu düşünelim. (1/mcu frekansı)*4 formülündeki 4'ün sebebi nedir peki ?


RaMu

Öyle bir kod yok, hatalı yazmışsın.
Gerçek bir kod derleyip asm çıktısını ekleyebilirsin.

Hatta kullandığın ide de debugger kısmına girip asm kodu adım adım işletip kendinde görebilirsin.


Bölü 4 ise
örneğin Pic10/12/16/18 kullanırsan bir komut 4 clock çevriminde işleniyor.
Kullandığın mcu ve optimizasyona göre değişir.
Örnek:
https://www.picproje.org/index.php?topic=65527.0
Bunun için Mips değeri var:
Million Instructions per Second
Saniyede yapılan milyon işlem (1 iş
işlem = 1 makina kodu) sayısı.

Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

robikod

#4
while(1){
                      HAL_GPIO_TogglePin(LED_RED_GPIO_Port, LED_RED_Pin);

}

Yapıp pini osiloskoptan görüntülediğimde 15us çıkıyor. Bu ölçtüğüm süre osiloskop frekansına göre de değişir mi peki ?

Mesela çok emin olduğum 1ms'de bir çalışan SysTick_Handler fonksiyonunda aynı testi yaptım.

SysTick_Handler içinde ledi toggle yapıp görüntüledim. Ancak 1 ms değerini göremedim. Bunun için osiloskobu da mı ayarlamak gerekiyor. Neden böyle bir ölçüm sonucu elde ediyorum?

bsenguler

Hesaplamak istediğin yerin asm çıktısına bakıp, bu çıktıdaki komutların kaç makina döngüsünde çalıştığına bakıp topladın mı süreyi bulursun.

robikod

Alıntı yapılan: bsenguler - 03 Eylül 2020, 14:33:11Hesaplamak istediğin yerin asm çıktısına bakıp, bu çıktıdaki komutların kaç makina döngüsünde çalıştığına bakıp topladın mı süreyi bulursun.

Peki osiloskop üzerinden elde ettiğim sonuçların doğruluğu hakkında ne düşünüyorsunuz?

bsenguler

ben size en kesin hesaplama yöntemini söyledim, osiloskopla ne kadar doğru olur bir şey diyemem

RaMu

Led toggle başka bir durum,
mcu pinini en kısa ne kadar sürede değiştirebileceğinin donanımsal yani mcu tasarımı sonucu bir sınırı var.
CubeMx kullanıyorsan düşük orta yüksek diye ayar yeri vardı.
Bu ayar direk pinin toggle edileceği hız değil biraz karışık.
Register olarak
http://fastbitlab.com/gpio-output-speed-register-applicability/
Ayrıca pine bağladığın yükün veya ölçüm yöntemininde etkisi var.

https://www.picproje.org/index.php?topic=72942.0

https://www.picproje.org/index.php/topic,75624.msg577059.html#msg577059

https://www.picproje.org/index.php?topic=39147.0


Ayrıca flash latency durumu var
yani kod flashtan okunup işleniyor
flasha erişşm süresi 6 clock herhaldd
kodu ramden çalıştırma gibi yöntemlerle işi hızlandırabiliyorsun.

Veya pwm spi vs. modüller ile pin daha hızlı toggle edilebiliyor.

O led toggle satırının 168MHz de çalışan stm için 15us sürmesi imkansız,
donanımsal olarak pini o kadar hızlı değiltiremiyorsun.

Alıntı yapılan: robikod - 03 Eylül 2020, 13:46:12...

SysTick_Handler içinde ledi toggle yapıp görüntüledim. Ancak 1 ms değerini göremedim.
...
Ne gördün, nasıl denedin, kod nerede?
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

robikod

Alıntı yapılan: RaMu - 03 Eylül 2020, 15:01:07Led toggle başka bir durum,
mcu pinini en kısa ne kadar sürede değiştirebileceğinin donanımsal yani mcu tasarımı sonucu bir sınırı var.
CubeMx kullanıyorsan düşük orta yüksek diye ayar yeri vardı.
Bu ayar direk pinin toggle edileceği hız değil biraz karışık.
Register olarak
http://fastbitlab.com/gpio-output-speed-register-applicability/
Ayrıca pine bağladığın yükün veya ölçüm yöntemininde etkisi var.

https://www.picproje.org/index.php?topic=72942.0

https://www.picproje.org/index.php/topic,75624.msg577059.html#msg577059

https://www.picproje.org/index.php?topic=39147.0


Ayrıca flash latency durumu var
yani kod flashtan okunup işleniyor
flasha erişşm süresi 6 clock herhaldd
kodu ramden çalıştırma gibi yöntemlerle işi hızlandırabiliyorsun.

Veya pwm spi vs. modüller ile pin daha hızlı toggle edilebiliyor.

O led toggle satırının 168MHz de çalışan stm için 15us sürmesi imkansız,
donanımsal olarak pini o kadar hızlı değiltiremiyorsun.
Ne gördün, nasıl denedin, kod nerede?

Evet başka bir hatam varmış.
Teşekkür ederim açıklamalar için faydalı oldu.

e-zeki

kaynağı bulamadım fakat arm mikrodenetleyicilerde  eğer kodun içinde flash write/erase rutinleri yoksa, kodu ram'den koşturmakla flash memory'de koşturmak arasında neredeyse hiç fark yok. kaynağı bulursam ekleyeceğim.

Tagli

Alıntı yapılan: e-zeki - 11 Eylül 2020, 16:00:26kaynağı bulamadım fakat arm mikrodenetleyicilerde  eğer kodun içinde flash write/erase rutinleri yoksa, kodu ram'den koşturmakla flash memory'de koşturmak arasında neredeyse hiç fark yok. kaynağı bulursam ekleyeceğim.
Konuyla ilgili iki anahtar kelime (terim) var:
1) Prefetch Buffer
2) ART Accelerator

Aralarındaki farkı bilmiyorum ama ikincisi daha gelişmiş bir donanım ve galiba STM32F4'lerde var. Temelde benzer şeyi yapıyorlar ama: Flash'a tek bir erişimde birkaç komut birden okuyorlar topluca. Böylece işlemci yüksek hızdayken bile sanki sıfır wait state varmış gibi çalışabiliyor. Tahminimce kodda hoplamalar zıplamalar çoksa prefetch işleminin performansa katkısı azalacaktır.

Bir de Speculative Execution diye bir şey var. Ancak bunun hangi türlüsünü hangi ARM çekirdekleri destekler onu araştırmak lazım, benim bilgim yok.

Ek olarak, bazı STM32 işlemcilerde CCM diye bir özel bir bellek bölgesi var. Buradan çalışan kod daha hızlı çalışıyormuş. Kodun yüksek performans gerektiren kısımlarının buraya taşınması öneriliyor. Ben hiç kullanmadım ama.
Gökçe Tağlıoğlu