Forum: Compiler & IDEs Grundsätzliche Frage zu Compilern / Arduino IDE im besonderen.


von Eric (Gast)


Lesenswert?

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

von jz (Gast)


Lesenswert?

Schalte mal die Optimierung vom Linker ein, dann werden nur noch die 
verwendeten Funktionen eingebunden.

von (prx) A. K. (prx)


Lesenswert?

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
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Willi (Gast)


Lesenswert?

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

von Horst (Gast)


Lesenswert?

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.

von Rene K. (xdraconix)


Lesenswert?

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.

von Programmiersprachentheaterintendant (Gast)


Lesenswert?

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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.