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
Xc8 full degilse kod optimizasyonu da iyi olmuyor.
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..
Aynı sorunu ben de yaşadım ama detayını araştırmadım.
%18 olan kod float kullanınca %68'lere çıkıyor.
acaba proton nasıl bu kadar optimize kod üretebilmiş?
Kesin float diye fixed point kullanıyordur protonu yazan amca. :)
Bu XC8 derleyicisinde bir bug.Mail atıp derleyicinin gelişmesinde yardımcı olabilirsiniz.
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.
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 ?
Bu konuyu bende çok merak ediyorum.
#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
// 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
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
kodlar derlendiğinde basicte %7 ve %8
c de %29 %44 oldu