Binary in ArduinoIDE größer als mit AtmelStudio.

Heya, ich habe spaßenshalber mal vergleichen wollen wie stark der Größenunterschied bei Verwendung von "Arduino-Befehlen" vs "native AVR" - Befehle ist. Alle Codebeispiele Blinken die LED im Sekundentakt. Alle wurden mit dem gcc Optimierungsparameter -Os (optimiere für Codegröße) kompiliert. Ziel-CPU ist ein 328p.

Dabei habe ich auch ein und den selben Code in AtmelStudio kompilieren lassen und hier die Ergebnisse:

ArduinoIDE:

boolean ledan = false;
void setup() {
pinMode(13, OUTPUT);
}

void loop() {
delay(1000);
digitalWrite(13, ledan?HIGH:LOW);
ledan=!ledan;
}

Binary-Size: 1026Bytes

ArduinoIDE:

#include <avr/io.h>
#include <util/delay.h>

void setup() {
DDRB |= _BV(PINB5);
}

void loop() {
_delay_ms(1000);
PORTB ^= _BV(PINB5);
}

Binary-Size: 478Bytes

AtmelStudio 6.2:

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>

int main(void){
DDRB |= _BV(PINB5); //PB5 (Pin13) als OUTPUT
while(1){
_delay_ms(1000);
PORTB ^= _BV(PINB5);
}
}

Binary-Size: 162Bytes

Kann mir einer einen Tipp geben wieso die ArduinoIDE trotz (fast) identischem Code ein so viel größeres Ergebnis kompiliert? Und vielleicht sogar, wie man das ändern kann?

Danke :slight_smile:

Die arduino.h wird immer eingebunden.
Damit auch die ganzen Daten, welche im Flash landen..

bzw:
Lass dir den Assembler Output anzeigen.

avr-objdump -DS Blink.cpp.elf

Dann siehst du die Unterschiede.

elfallino:
Kann mir einer einen Tipp geben wieso die ArduinoIDE trotz (fast) identischem Code ein so viel größeres Ergebnis kompiliert?

Weil Du Äpfel mit Birnen vergleichst.
Ein Arduino-Sketch mit "setup()" und "loop()" Funktionen initialisiert dabei automatisch die Arduino Core-Libraries, setzt dabei beispielsweise Timer0 in Gang und stellt ein Timing mit millis() und micros() zur Verfügung.

elfallino:
Und vielleicht sogar, wie man das ändern kann?

Verwende in der Arduino-IDE dasselbe Programm wie mit Atmel Studio! Also mit main() Funktion, damit der Arduino Core nicht initialisiert wird.

Ich erhalte damit bei Arduino 1.6.4 kompiliert mit Board-Einstellung "UNO":
Sketch uses 162 bytes (0%) of program storage space. Maximum is 32,256 bytes.

So what?

Wenn Du mit Arduino eine größere Binary-Size bekommst trotz Verwendung von einer "main()" Funktion, dann prüfe mal:

  • die verwendete Arduino Version
  • für welche Zielplattform Du kompilierst
    Eine identische Programmgröße kann sich natürlich auch nur dann ergeben, wenn Du bei Atmel Studio für Atmega328 ein Programm erzeugst und vergleichsweise mit einer (aktuellen) IDE Version auch mit der Arduino-IDE für dieselbe Zielplattform.

Verwende in der Arduino-IDE dasselbe Programm wie mit Atmel Studio! Also mit main() Funktion, damit der Arduino Core nicht initialisiert wird.

Danke!

Außerdem hat der Compiler Einstellungen die das Ergebnis beeinflussen zb Code optimiert auf Größe, Geschwindigkeit ecc. Die verwendeten Parameter müssen bei Arduino IDE und AtmelStudio 6.2 nicht gleich sein. Es müssen nicht mal die gleichen Versionen des Compilers sein.

Grüße Uwe

Verwende in der Arduino-IDE dasselbe Programm wie mit Atmel Studio! Also mit main() Funktion, damit der Arduino Core nicht initialisiert wird.

Ah gut. Wusste ich nicht dass man das machen kann. Tatsächlich ist das Ergebnis jetzt mit dem aus AtmelStudio vergleichbar.

Ein Arduino-Sketch mit "setup()" und "loop()" Funktionen initialisiert dabei automatisch die Arduino Core-Libraries, setzt dabei beispielsweise Timer0 in Gang und stellt ein Timing mit millis() und micros() zur Verfügung.

Das beantwortet meine initiale Frage. Danke.

Außerdem hat der Compiler Einstellungen die das Ergebnis beeinflussen zb Code optimiert auf Größe, Geschwindigkeit ecc

Das habe ich ja im Eröffnungsthread bereits angesprochen, dass diese Parameter gleich sind.

Meine Frage ist beantwortet. Danke.

/In der neuen ArduinoIDE 1.6.5 ist der Code dann aber schon wieder 230kB groß.../

Mein Fehler - Falsches Board gewählt.