Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

winavrdeki gariplik

Başlatan Erhan YILMAZ, 24 Eylül 2009, 20:16:23

Erhan YILMAZ

Bu aralar avr ve onun bedava olan winavr c derleyicisine göz atıyordum ve attiny2313 ile sıradan bir led yakma uygulaması yapım dedim kodları yazıp çalıştırınca isite herhangi bir sorun olmadan çalıştı sonrasında hex kodlarını tekrar asmye çevirip incelediğimde winavrdeki garipliği fark ettim programda fonksiyonları hiç bir şekilde alt program şeklinde çağırmamış fonksiyonu gördüğü yerde aynen kopyalamış asıl fonksiyonu tanımladığım yere fonksiyonu yazmış ve program içerisinde hiç çağırmamış bu sayede 1 led yakma söndürme 110byte mal olmuş kodları inceleyince daha iyi anlarsınız sizce bir yerde yanlışmı yapıyorum yada derleyici bedava diye üretenler umursamamışmı

c kodları
#include <avr/io.h>
#include <avr/delay.h>

extern void delay(void);



void main (void)
{
// set PORTD for output
DDRB = 0xFF;
while(1) {
PORTB |= _BV(PORTB7);
delay();
PORTB &= ~_BV(PORTB7);
delay();
 }}

void delay (void){
_delay_loop_2(30000);
_delay_loop_2(30000);
}


üretilen asm kodlar
+00000000:   C012        RJMP      PC+0x0013      Relative jump
+00000001:   C017        RJMP      PC+0x0018      Relative jump
+00000002:   C016        RJMP      PC+0x0017      Relative jump
+00000003:   C015        RJMP      PC+0x0016      Relative jump
+00000004:   C014        RJMP      PC+0x0015      Relative jump
+00000005:   C013        RJMP      PC+0x0014      Relative jump
+00000006:   C012        RJMP      PC+0x0013      Relative jump
+00000007:   C011        RJMP      PC+0x0012      Relative jump
+00000008:   C010        RJMP      PC+0x0011      Relative jump
+00000009:   C00F        RJMP      PC+0x0010      Relative jump
+0000000A:   C00E        RJMP      PC+0x000F      Relative jump
+0000000B:   C00D        RJMP      PC+0x000E      Relative jump
+0000000C:   C00C        RJMP      PC+0x000D      Relative jump
+0000000D:   C00B        RJMP      PC+0x000C      Relative jump
+0000000E:   C00A        RJMP      PC+0x000B      Relative jump
+0000000F:   C009        RJMP      PC+0x000A      Relative jump
+00000010:   C008        RJMP      PC+0x0009      Relative jump
+00000011:   C007        RJMP      PC+0x0008      Relative jump
+00000012:   C006        RJMP      PC+0x0007      Relative jump

+00000013:   2411        CLR       R1             Clear Register
+00000014:   BE1F        OUT       0x3F,R1        Out to I/O location
+00000015:   EDCF        LDI       R28,0xDF       Load immediate
+00000016:   BFCD        OUT       0x3D,R28       Out to I/O location
void main(void)
+00000017:   D002        RCALL     PC+0x0003      Relative call subroutine ;3 adım ileri git
+00000018:   C01C        RJMP      PC+0x001D      Relative jump	;sona git
+00000019:   CFE6        RJMP      PC-0x0019      Relative jump	;başa git

+0000001A:   EF8F        SER       R24            Set Register			;DDRB = 0xFF;
+0000001B:   BB87        OUT       0x17,R24       Out to I/O location	;
while(1){
+0000001C:   E320        LDI       R18,0x30       Load immediate		;30000 değerini
+0000001D:   E735        LDI       R19,0x75       Load immediate		;yükle

+0000001E:   9AC7        SBI       0x18,7         Set bit in I/O register		;PORTB |= _BV(PORTB7);
+0000001F:   01C9        MOVW      R24,R18        Copy register pair			;_delay_loop_2(30000);
+00000020:   9701        SBIW      R24,0x01       Subtract immediate from word	;
+00000021:   F7F1        BRNE      PC-0x01        Branch if not equal			;
+00000022:   01C9        MOVW      R24,R18        Copy register pair			;_delay_loop_2(30000);
+00000023:   9701        SBIW      R24,0x01       Subtract immediate from word	;
+00000024:   F7F1        BRNE      PC-0x01        Branch if not equal			;

+00000025:   98C7        CBI       0x18,7         Clear bit in I/O register		;PORTB &= ~_BV(PORTB7);
+00000026:   01C9        MOVW      R24,R18        Copy register pair			;_delay_loop_2(30000);
+00000027:   9701        SBIW      R24,0x01       Subtract immediate from word	;
+00000028:   F7F1        BRNE      PC-0x01        Branch if not equal			;
+00000029:   01C9        MOVW      R24,R18        Copy register pair			;_delay_loop_2(30000);
+0000002A:   9701        SBIW      R24,0x01       Subtract immediate from word	;
+0000002B:   F7F1        BRNE      PC-0x01        Branch if not equal			;

+0000002C:   CFF1        RJMP      PC-0x000E      Relative jump } ;14 satır geri
;hiç işletilmeyen kod bloğu
+0000002D:   E380        LDI       R24,0x30       Load immediate		;30000 değerini
+0000002E:   E795        LDI       R25,0x75       Load immediate		;yükle
+0000002F:   01FC        MOVW      R30,R24        Copy register pair	;
+00000030:   9731        SBIW      R30,0x01       Subtract immediate from word	;_delay_loop_2(30000);
+00000031:   F7F1        BRNE      PC-0x01        Branch if not equal			;
+00000032:   9701        SBIW      R24,0x01       Subtract immediate from word	;_delay_loop_2(30000);
+00000033:   F7F1        BRNE      PC-0x01        Branch if not equal			;

+00000034:   9508        RET                      Subroutine return }
+00000035:   94F8        CLI                      Global Interrupt Disable
+00000036:   CFFF        RJMP      PC-0x0000      Relative jump ;en başa dön

parda

Merhaba;

Optimization level nedir ?
Bildiğim tek şey, hiç bir şey bilmediğimdir.

Erhan YILMAZ

Optimization level varmı bilmiyorum program ücretsiz olduğu için kendi arayüzü yok programmers notepad editör üzerinden kodları yazıp derlettiriyorsun muhtemelen yoktur

parda

makefile dosyasının içinde bir çok ayar ve kısa açıklamaları var ilk olarak Optimization level değiştir derim.
Bildiğim tek şey, hiç bir şey bilmediğimdir.

Erhan YILMAZ

dediğin gibi baktım optimization ayarlarına hepsinde sonuç aynı 110 byte da derliyor diğer ayarlarla ilgili bir şey değiştirmedim

# Optimization level, can be [0, 1, 2, 3, s].
#     0 = turn off optimization. s = optimize for size.
#     (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
OPT = s

rojhatbilge

Evet, Atmel AVR'ler program belleği sarfiyatında çok bonkör. Pic'le 500 byte'ye sığdırdığım programın aynı işini yapan program AVR'de derlenince 2000byte'nin bile üzerine çıkıyor.
Sorun derleyicilerde değil çünkü ben 2 farklı derleyici kullanıyorum ikisinde de aynı bellek sarfiyatı var.

Bu arada Winavr, AVRstudio ile beraber IDE oluşturup çalışabiliyor.

Bir AVRstudio download et sonra WinAVR'yi yükle. AVRStudiod' C kodunu yazıp aynı sayfada kısayollarla derleyebilirsin.