optimize kod

Başlatan ahmetbudak, 05 Şubat 2014, 21:08:47

ahmetbudak

arkadaşlar iyi akşamlar aşağıda 16f877 için  XC8 ve proton örneği var ikiside aynı görsün yazıp derledim
XC8 yazıp derlenen kod  %28 RAM   % 44 flash kullandı
proton da ise %3 ve %5 mertebesinde
bu durum nasıl açıklanabilir (özellikle float değişken kullanımında C de bu değerler yükseliyor)
kod 1:
int main() {
    float a=14.15;
  
   char text1 [1];

    TRISA = 0x00;
    PORTA = 0x00;
    TRISB = 0x00;
    PORTB = 0x00;
        lcd_init();
       	lcd_goto(0);	// select first line
	sprintf(text1,"%.2f",a);
        lcd_puts(text1);
         while(1);

	}


kod 2:
Device=16F877
Dim a As Float
a=14.15
Declare LCD_Lines=2
Declare LCD_DTPin PORTB.0
Declare LCD_ENPin PORTB.5
Declare LCD_RSPin PORTB.4
Declare LCD_CommandUs 2000
Declare LCD_DataUs 50
basla:
  Print At 1,1 , a
  GoTo basla

LukeSkywalker

Xc8 full degilse kod optimizasyonu da iyi olmuyor.

ahmetbudak

Alıntı yapılan: LukeSkywalker - 05 Şubat 2014, 21:12:00
Xc8 full değilse kod optimizasyonu da iyi olmuyor.
full optimizasyonda pro seçili ama..

subram

Aynı sorunu ben de yaşadım ama detayını araştırmadım.
%18 olan kod float kullanınca %68'lere çıkıyor.
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

ahmetbudak

acaba proton nasıl bu kadar optimize kod üretebilmiş?

Burak B

Kesin float diye fixed point kullanıyordur protonu yazan amca. :)
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

Mr.Java

Bu XC8 derleyicisinde bir bug.Mail atıp derleyicinin gelişmesinde yardımcı olabilirsiniz.

LukeSkywalker

Printf komutu ve türevleri zaten çok yer kaplar. Mümkün olduğu kadar bu komutları kullanmamak lazım. Ben sizin terinizde olsam LCD'ye veri yazma işini kendim LCD_out gibi bir fonksiyon oluşturarak yapardım.

Erol YILMAZ

Her iki derleyiciye de,

a = a+0.001

komutunu ekleyerek, toplamda...

C için;

a=a+0.001;
sprintf("");
lcdputs("");



BASIC için;

a=a+0.001
Print At 1,1 , a

komut dizisini 5 kere ardı ardına çağırarak derler misiniz ?

Mucit23

Bu konuyu bende çok merak ediyorum.

sadogan

#include <16f877.h>      
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                      //HACİRİCİ KRİSTAL OSİLATÖR KULLANILACAK
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#use delay(clock=4000000)
#include <lcd.c>
int main(void) {
    float a=14.15;
   char text1 [1];
        lcd_init();
      lcd_gotoxy(1,2);   // select first line
    sprintf(text1,"%.2f",a);
        lcd_putc(text1);
         while(1);

    }

CCS ne yapıyor diye merak ettim
sonuc RAM %10 ROM %9

LukeSkywalker

// Lcd pinout settings
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;

// Pin direction
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;

void main() {
   float a=14.15;
   char *text1;
   lcd_init();
   floattostr(a,text1);
   lcd_out(1,1,text1);
   while(1);
    }


MikroC Pro, ram %10 - rom %13

ahmetbudak

#12
Alıntı yapılan: Allegro - 06 Şubat 2014, 00:18:13
Her iki derleyiciye de,

a = a+0.001

komutunu ekleyerek, toplamda...

C için;

a=a+0.001;
sprintf("");
lcdputs("");



BASIC için;

a=a+0.001
Print At 1,1 , a

komut dizisini 5 kere ardı ardına çağırarak derler misiniz
kodlar derlendiğinde basicte  %7 ve %8
c de %29 %44 oldu

ahmetbudak

kodlar derlendiğinde basicte  %7 ve %8
c de %29 %44 oldu