unterschiedliche Größen bei unterschiedlichen Arduino Versionen

Hallo zusammen,

zur Zeit programmiere ich ein kleines Projekt (Lüftersteuerung mit Luftfeuchte-/Temperaturmessung).
Dazu verwendete ich die Arduino 1.0.5 IDE auf einem Laptop mit Win 8.1, seit heute auch Arduino 1.0.6.

Weil ich an einigen Stellen ziemlich kämpfen musste und ich auch nach dem Ausmerzen etlicher selbstgebauter Fallen und Fehler der Eindruck hatte, dass manche Schleifen nicht so laufen, wie sie sollten, nahm ich den kompletten Sketch samt DHT Library auf mein Netbook unter Linux (Mint).
Dort ist die Arduino IDE 1.0.5 installiert.

Ohne jegliche Änderung lief die Kompilierung durch, jedoch im Ergebnis mit deutlich kleinerer Größe!
Auf der Lüftersteuerungs-Hardware läuft die Software ebenso wie das Kompilat vom Windowrechner.

Um die Sache zu überprüfen, schrieb ich einen kleinen Testsketch "Flip-Flop" (eine Taste am digitalen Eingang, zwei Leuchtdioden, alles auf einen alten 2009er Arduino), wobei beim Drücken der Taste eine Leuchtdiode Aus -> Ein -> Aus geschaltet wird, eben "Flip-Flop", auf dem Netbook unter Linux und kopierte den Sketch auf den Windows Laptop.

Ergebnis:

Arduino 1.0.5 (Linux) 1466 Byte
Arduino 1.0.5 (Win8.1) 1588 Byte
Arduino 1.0.6 (Win8.1) 1594 Byte

Gibt es hier Erkenntnisse zu den Gründen?

Gruß
Manfred

Ich würde mal auf leicht unterschiedliche Compiler/Libs/Linker tippen....

ja, das wird wohl so sein.
Unter Linux ist das Verhalten der IDE sowieso deutlich anders als bei den Windows Versionen.

ManfredH:
Ergebnis:

Arduino 1.0.5 (Linux) 1466 Byte
Arduino 1.0.5 (Win8.1) 1588 Byte
Arduino 1.0.6 (Win8.1) 1594 Byte

Wenn Du vergleichen möchtest, ob in den Dateien tatsächlich etwas mit verschiedener Größe codiert ist, wendest Du am besten das Tool "avr-size" auf die hex-Datei an und siehst Dir an, was avr-size ausgibt!

Die Ausgabe von avr-size sieht beispielsweise bei einer 14025 Bytes großen hex-Datei ungefähr so aus:

   text    data     bss     dec     hex filename
      0    4978       0    4978    1372 C:\Users\Username\AppData\Local\Temp\build6489415861915120060.tmp\buttonDemo3.cpp.hex

Einfacher läßt sich die dezimale Dateigröße vergleichen, wenn Du die Ausgabe im Statusfenster beim Compilieren beachtest, die auf einem MEGA z.B. so aussieht:

Binäre Sketchgröße: 4.978 Bytes (von einem Maximum von 258.048 Bytes)

Dies wären dieselben 4978 Bytes, die auch das avr-size Tool anzeigt und diese Größe steht dafür, wieviele Bytes vom Programm tatsächlich im Flash-Speicher belegt werden.

meine obige Angabe zu den Größen ist genau diese Angabe aus dem Statusfenster, das Du erwähnst.

ManfredH:
meine obige Angabe zu den Größen ist genau diese Angabe aus dem Statusfenster, das Du erwähnst.

Ob auf den verschiedenen Plattformen auch dieselben Versionsnummern des GCC-Compilers und der AVR-LIBC verwendet werden, kannst Du mit einem Programm direkt abfragen.

void setup() {
  Serial.begin(9600);
  Serial.println();
  
  Serial.print(F("__VERSION__ = "));
  Serial.println(F(__VERSION__));

  Serial.print(F("__DATE__    = "));
  Serial.println(F(__DATE__));

  Serial.print(F("__TIME__    = "));
  Serial.println(F(__TIME__));

  Serial.print(F("__AVR_LIBC_VERSION_STRING__ = "));
  Serial.println(F(__AVR_LIBC_VERSION_STRING__));

  Serial.print(F("__FILE__    = "));
  Serial.println(F(__FILE__));

  Serial.print(F("__STDC__    = "));
  Serial.println(__STDC__,DEC);
}

void loop() {
}

Falls die Unterschiede durch Unterschiede in den Arduino Core-Libraries oder Versionsunterschiede der im Compile- und Link-Prozess eingesetzten Tools bedingt sind, sieht man allerdings auch dort keine Unterschiede.

Bei den niedrigen Arduino Versionsnummern (1.0.*) sind unter Windows veraltete Compiler dabei. Unter Linux hängt es von der Distro ab. 1.5.8 und höher haben neuere Compiler an Board. Der neuere GCC liefert oft kompakteren Code. Ansonsten hängt es wie schon vermutet von Änderungen in den Libraries ab. Ich verwende fast nur noch 1.5.8 oder höher weil der Compiler dort VIEL besser ist.

Kann ich dir ein Lied von singen, was ich von dem neuen VIEL besserem Compiler habe...
Beim kompilieren zeigt der mir jedesmal ein Fehler an, USBasp läuft überhaupt nicht.

Das hat aber nichts mit dem Compiler zu tun! Das Problem ist, dass es in den neuen Versionen mehr Parametersätze für die Programmer gibt.

Nicht nur der Programmer kann Probleme bekommen. Der andere Teil von Problemen hat mit der bescheidenen Qualität einiger Arduino Libraries zu tun. Auf der anderen Seite ist der erzeugte Code wirklich viel besser. Ist ja alles open source, d.h. man kann auch die Libraries die man braucht aufräumen. Meine DCF77 lib ist neuerdings aufgeräumt :slight_smile:

Meine DCF77 lib ist neuerdings aufgeräumt

Udo, wenns nicht open source wäre, würdest du langsam nerven. :wink: :wink: :wink:

Dass deine DCF Software die beste ist, weiss hier jeder !

Dass sie auf einem Uno und mit dem alten Compiler nicht läuft, spricht nur gegen den Uno und die alten Compiler SCNR

moin,
ich finde es jetzt auf Anhieb nicht mehr, aber kürzlich las ich (glaube ich, gelesen zu haben) im arduino.cc Umfeld, dass die Arduino IDE 1.5.x fü die YUN Nutzer zwingend erforderlich ist und für alle anderen Boards die aktuelle 1.0.x empfohlen wird.
Habe ich falsch gelesen oder falsch interpretiert?

Manfred

Offiziell ja. Aber ich würde das so nicht unterschreiben.

Da wird so getan als ob 1.0.x fehlerfrei wäre, was bei weitem nicht der Fall ist. Es gibt inzwischen auch in den absoluten Standard-Klassen einige Verbesserungen, z.B. bei Serial.

Und wie Udo gesagt hat, hat man in 1.5.7 (nicht in 1.5.8 ) endlich mal die AVR Toolchain aktualisiert. Die war geradezu antik. Der Compiler selbst hatte da einige bekannte Bugs.

jurs:
Ob auf den verschiedenen Plattformen auch dieselben Versionsnummern des GCC-Compilers und der AVR-LIBC verwendet werden, kannst Du mit einem Programm direkt abfragen.

}

Falls die Unterschiede durch Unterschiede in den Arduino Core-Libraries oder Versionsunterschiede der im Compile- und Link-Prozess eingesetzten Tools bedingt sind, sieht man allerdings auch dort keine Unterschiede.

Das ist ja mal interessant:
Eben gerade auf beiden Rechnern (zur Erinnerung: Win8.1 und Arduino 1.06 / Linux Mint Arduino 1.0.5 + dfsg2-2) Dein Progrämmchen laufen lassen:

Win/Arduino 1.0.6

Version: 4.3.2
AVR LIBC Version: 1.6.4

Linux/Arduino 1.0.5

Version: 4.8.2
AVR LIBC Version: 1.8.0

ManfredH:
Linux/Arduino 1.0.5

Version: 4.8.2
AVR LIBC Version: 1.8.0

Dein Linux verwendet offenbar schon bei der Arduino-IDE 1.0.5 die deutlich modernere GCC-Version und auch die neuere AVR LIBC, die bei Windows erst ab der Arduino-IDE 1.5.7 enthalten sind.

Dann weißt Du ja, wo die Unterschiede und die kleinere Programmgröße herkommen.

Der GCC-Compiler 4.8.2 erzeugt bei fast allen Programmen deutlich kleineren Code als die alte GCC 4.3.2 Version, durch verbesserte Optimierung auf kleinere Programmgröße.