Hallo, ich würde gerne wissen ob ein Compiler die eingebundenen Bibliotheken immer komplett nutzt bzw. kompiliert, oder ob er sich nur die benötigten Funktionen heraussucht und in das entsprechende Programm kompiliert. Im besonderen geht es mir um die Arduino IDE und die Bibliotheken für ein OLED Display. Ich benutze die Bibliotheken von Adafruit (Adafruit_GFX.h und Adafruit_SSD1306.h) und auch wenn ich keine Grafikfunktionen der Bibliothek nutze, die meiner Meinung nach wesentlich mehr Code produzieren, habe ich allein wenn ich diese Bibliotheken einbinde und lediglich ein "Hallo Welt" auf dem Display ausgeben möchte schon die Hälfte der 32kB meines Controllers voll... lade ich das komplette Adafruit OLED Demo Sktech in den Controller (ATmega 32U4) ist es hingegen nur geringfügig mehr (ca. 60%), daher die Frage. Wenn ich jetzt die OLED Bibliotheken ausdünnen würde, weil ich weiß das ich zum Beispiel gar keinen Kreis oder ein Bitmap in den Controller laden möchte, dann könnte ich auf diese Weise doch Speicherplatz paren, richtig? Ich bedanke mich schon im Voraus für eure Antworten, habt noch einen ruhigen Nachmittag :)
Schalte mal die Optimierung vom Linker ein, dann werden nur noch die verwendeten Funktionen eingebunden.
Eric schrieb: > ich würde gerne wissen ob ein Compiler die eingebundenen Bibliotheken > immer komplett nutzt bzw. kompiliert, oder ob er sich nur die benötigten > Funktionen heraussucht und in das entsprechende Programm kompiliert. Ganz allgemein gilt: Wenn Libs so gebaut sind, dass die einzelnen Komponenten separate Teile in den Libs sind, dann werden nur die benötigten Teile gezogen. Normalerweise ist es dazu nötig, diese Komponenten als separate Quellcode-Files zu auftrennen. Also eines für Kreis, eines für Bitmap etc. Mindestens GCC kann aber optional aus einem Quellcode-File eine Lib erzeugen, in der die einzelnen Funktionen und Daten darin bereits automatisch als separate Teile aufgetrennt sind und der Linker kann sich dann nur die benötigten rauspicken.
:
Bearbeitet durch User
Hier dürfte das Arduino-übliche Missverständnis darüber vorliegen, wie man die Dateien nennt, die mittels "#include" eingebunden werden. Irgendjemand unter den Arduino-Schöpfern hat die *vollkommen idiotische Idee* gehabt, diese Dateien als "Library" zu bezeichnen. Das ist sachlich komplett falsch, und Ursache vieler Irritationen.
Rufus Τ. F. schrieb: > ...Das ist sachlich komplett falsch, und Ursache vieler Irritationen. Könntest du das bitte etwas mehr erklären. Was ist falsch an den Arduino-"libraries" bzw. wie wäre es richtig ? Und zur Frage des TE: Werden bei der Arduino-IDE die kompletten "Libs" mit eingebunden, oder nur die benutzten Teile ? MfG Willi
Eric schrieb: > lediglich ein "Hallo Welt" auf dem Display ausgeben möchte Also einmal der komplette Zeichensatz in den Speicher. Eric schrieb: > Wenn ich jetzt die OLED Bibliotheken ausdünnen würde, weil ich weiß das > ich zum Beispiel gar keinen Kreis oder ein Bitmap in den Controller > laden möchte, dann könnte ich auf diese Weise doch Speicherplatz paren, > richtig? Kannst Du, bringt aber wenig. Nur die Buchstaben einzubinden, die Du wirklich brauchst würde mehr bringen. Dafür müsstest Du aber die ganze Textausgabe anpassen.
Die Frage ist: WAS ist voll? Horst schrieb: > Also einmal der komplette Zeichensatz in den Speicher. "Einmal den Kompletten Zeichensatz" bedeutet maximal 256*8 byte - 2kb, beim 32u4 sind das ungefähr 6% Flash. Ich gehe aber davon aus (ich kenne die Lib nicht) das der Zeichensatz nicht komplett ist, sondern die üblichen Verdächtigen (Buchstaben, Zahlen, Satz- / Sonderzeichen) auch noch im EEPROM abgelegt werden. Dieser dürfte dann quasi beim belegten Speicher keinerlei Rolle mehr spielen. Im allgemeinen dürfte die Anbindung eines SSD1306 keinerlei große Flashbelastung sein. Wir haben hier im Projekte Sub Forum einen langen Thread mit mehreren Headerfiles für diverse Platformen (AVR, STM32, etc...) für den SSD1306, vielleicht mal davon eine probieren.
Willi schrieb: > Rufus Τ. F. schrieb: >> ...Das ist sachlich komplett falsch, und Ursache vieler Irritationen. > > Könntest du das bitte etwas mehr erklären. > Was ist falsch an den Arduino-"libraries" bzw. wie wäre es richtig ? Libraries sind vorkompilierte, also in binärer Form vorliegende, "Codeschnipsel" und werden zum gerade zu buildenden Code (ein eigentliches Programm mit /main()/ oder eine weitere Library ohne /main()/ nur dazugelinkt). Dazu wird bei gcc die Option -L und -l verwendet. Um eine Library nutzen zu können, ist deren Quellcode nicht nötig, lediglich eine "Beschreibung" des Inhaltes was in C/C++ halt doch in Form einer oder mehreren Headerdateien ist. <http://www.rapidtables.com/code/linux/gcc/gcc-l.htm> Der Sinn davon ist Compilerlaufzeit zu sparen (bei popeligen uC Projektchen nicht relevant) und Qualitätssicherung: eine einmal auf Herz und Nieren, also Funktion und Laufzeitverhalten, geprüfte Library soll exakt in dieser binären Form weiter eingesetzt werden. Also ohne sie dem Risiko anderer Compileroptionen, Compilersversionen anders übersetzt zu bekommen. Die Codebibliothek wie sie Arduino präsentiert kommt immer in Quellcode daher (gut zum lernen) und es werden die daraus verwendeten Stücke bei jedem Buildvorgang eines jeden Sketches neu übersetzt (obschon sich am Quelltext der "lib" ja nichts verändert hat). > Und zur Frage des TE: > Werdenbei der Arduino-IDE die kompletten "Libs" mit eingebunden, oder > nur die benutzten Teile ? Wurde bereits beantwortet: siehe Linkoptionen. Arduino ist Quelloffen: einfach nachgucken (gut zum lernen).
Programmiersprachentheaterintendant schrieb: > Dazu wird bei gcc die Option -L und -l verwendet. Wobei gcc beim Linken diese Optionen für die Standard-Bibliotheken selbst korrekt setzt, d.h. für libgcc.a, libc.a, libm.a und lib$device.a brauch man da nicht von Hand rumzufutscheln.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.