Derleyici Hız testleri

Başlatan Mucit23, 07 Ağustos 2012, 17:42:23

Mucit23

Arkadaşlar işten biraz vakit bulunca kullandığım derleyicilerle ufak bir test yapayım dedim.

Yaptığım test şöyle

Yazdığım programla Portbnin 0. bitini sonsuzbir döngü içerisinde sürekli 1 hemen ardından bekleme yapmadan 0 yapıyorum. Sonra gerçekte osiloskopla Portb nin 0. bitine bakıp çıkan sinyali ve frekansını ölçüyorum. Sonuçlar ilgi çekici

İlk önce PicBasic ile 18F452 için kod yazdım. İşlemciye 10Mhz kristal bağlı. PLL açık iken ve kapalı iken denemeler yapıyorum.

PicBasic ile Yazdığım kod

DEFINE OSC 40

@ __CONFIG    _CONFIG1H,  _HS_OSC_1H 

TRISB=0
PORTB=0

WHILE 1=1
PORTB=$01
PORTB=$00
WEND

END


şuanda PLL kapalı, İşlemci 10Mhz hızda çalışıyor PLL kapalı iken porb.0 pininden 500Khz, PLL açık iken 40Mhz hızda 2Mhz lik kare bir dalga alıyorum.

Aynı işlemi Proton için tekrarladım

Proton için yazdığım kod

Device 18F452
Xtal 40

Config_Start
   OSC = HS ; HS
Config_End

TRISB=0
PORTB=0

While 1=1
PORTB=$01
PORTB=$00
Wend
End


Aynı şekilde PLL kapalı iken 500Khz,PLL açık iken 2Mhz Bir sinyal çıkıyor

Aynı işlemi CSS C  için yaptım.

Yazdığım kod şöyle
#include <son.h>

void main()
{
   setup_timer_3(T3_DISABLED | T3_DIV_BY_1);
  
  set_tris_b(0x00);
  output_b(0x00);
 

   while(true)
   {
      output_high(pin_b0);
      output_low(pin_b0);
   }

}


Son.h dosyası
#include <18F452.h>
#device adc=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES H4                       //High speed osc with HW enabled 4X PLL
#FUSES OSCSEN                   //Oscillator switching is enabled
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(clock=10000000)


Sonuç biraz ilginç açıkçası
PLL kapalı iken 10Mhz hızda Porb nin 0. bitinden aldığım sinyal 416Khz, PLL yi açıp OSC frekansını 40Mhz 'e çıkardığımda ise aldığım sinyal 1,66Mhz

Birde MikroC ile test Yaptım İşlemci ve donanım aynı
Yazdığım kod ise aşağıdaki gibidir.

void main()
{
TRISB=0X00;
PORTB=0X00;

while (1)
{
portb=0x01;
portb=0x00;
}

}


Sonuç PicBasic ve Protonda olduğu gibi, 10Mhz Hızda 500Khz, 40Mhz hızda ise 2Mhz bir sinyal aldım.

Son olarak Aynı Testi Mplab ile yaptım. Sonuç şaşırtıcı olmasada ilginçti

ASM ile yazdığım kod şudur.
LIST P = PIC18F452
INCLUDE "P18F452.INC"

__CONFIG    _CONFIG1H,   _HSPLL_OSC_1H

ORG 0x00

	BANKSEL TRISB
	MOVLW h'00'
	MOVWF TRISB
	
DON
	BSF PORTB,0
	BCF PORTB,0
	GOTO DON
END


Burada ise aldığım sonuçlar şöyle

PLL kapalı iken 10Mhz hızda 625Khz, PLL yi açıkken 40Mhz hızda ise 2,50Mhz Bir sinyal aldım.

Şimdi CSS neden böyle bir sonuç verdi açıkçası anlamadım ama sizce bu yaptığım testlerden aldığım sonuçlar nekadar geçerlidir?

JKramer

#1
CCS'de fast_io kullanmazsanız derleyici her giriş-çıkış işleminde ilgili tris register'ını günceller. (Ek: Bu, giriş-çıkış işlemleri için output-input gibi fonksiyonları kullandığınızda geçerli, doğrudan LATB0=1 yazarsanız sorun olmaz.) Bir de bu kadar uğraşmak yerine list dosyalarından üretilen koda baksanız da olurdu :).

Mucit23

Doğrudur aslında Css pek kullanmadığım için gözümden kaçmış. Birde öyle deniyeyim

OG

Mplab da direk asm çalışıyorsunuz diğerlerine haksızlık  :)
Kodu bütün derleyicilerde asm olarak gömün.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

Mucit23

aslında denemedim  ama css  c de port yonlendirmelerini  yapsaydım eminim diğerleriyle aynı sonucu alırdım.
Peki hepsinde asm ile yazsaydim farkedermiydi

XX_CİHAN_XX

Burada da açıkça görüldüğü gibi Asm ile diğerlerinde çıkamadığın hıza çıkarsın kesinlikle.
Bir başka değişle bütüne baktığımızda diğer diller ile asm nin hızına erişmen mümkün değildir.

Yani hız olarak kıyaslama yapıyorsak asm yi ayrı tutmamız gerekir :)

Ek olarak bu kadarlık bir kod ile hangi derleyicinin optimum kodu ürettiğini anlamak deneyinden de görüldüğü üzere yeterli değildir.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

mavikaplan

picbasic , ccs c 'yi resmen ezmiş :D, ama Assembly gelince ortalığı dağıtmış alayını buruşturup çöpe atmış :D. Assembly kral, gönüllerin kahramanı :D