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:
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?
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.
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.
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.