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