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
Merhaba;
Optimization level nedir ?
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
makefile dosyasının içinde bir çok ayar ve kısa açıklamaları var ilk olarak Optimization level değiştir derim.
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
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.