Hallo,
bei meinem ersten Tests mit einem OLED 128x64 Display (SH1106
Controller) bekomme ich die beim compilieren die Fehlermeldung
"LCD_128x64.elf section "text will not fit in region text" wenn ich z.B.
1
u8g_SetFont(&u8g,u8g_font_osb18);
verwende.
1
u8g_SetFont(&u8g,u8g_font_9x18);
oder auch eine kleinere Schriftgröße funktioniert.
Ich verwende die avr u8glib mit einem ATMega88.
Kann mir jemand sagen, warum ich diese Fehlermeldung erhalte und wie ich
größere Fonts verwenden kann?
M. G. schrieb:> Kann mir jemand sagen, warum ich diese Fehlermeldung erhalte und wie ich> größere Fonts verwenden kann?
Wie der Vorposter meinte, du hast zu wenig Flash.
Du könntest versuchen, die Compiler-Optimierung auf maximum hochdrehen
(-Os), aber das wird nicht lange reichen.
Du könntest auch verwenden, den Zeichensatz deines Fonts auf das Minimum
zu reduzieren - Z.B. wenn du nur Zahlen brauchst von "0"-"9"
Weiterhin könntest du über einen größeren Controller nachdenken.
u8g2 schrieb:> Wichtig ist es die Garbage Collection des Linkers zu aktivieren:
Kannst du mir hierzu bitte genaueres sagen?
Ich verwende AtmelStudio 7. Warum ist es notwendig die Garbage
Collection des Linkers zu aktivieren?
Was passiert hier?
> Kannst du mir hierzu bitte genaueres sagen?
In der u8glib (und auch die Nachfolge-Lib u8g2) sind beispielsweise
mehrere hundert Fonts eingebaut. Die Fonts müssen nicht umständlich
"includiert" werden, sondern sind einfach "da" und können jederzeit via
u8g_SetFont verwendet werden.
Jedoch würden die nicht verwendeten Fonts im Flash-Speicher deines
Controllers landen, wenn man dem Linker nicht sagen würde, dass eben
diese nicht verwendeten Fonts weggelassen werden können. Genau das macht
der Garbage Collector des Linkers.
Es gibt natürlich noch ein paar andere Vorteile: Nicht benötigte
Funktionen der u8glib (Kreiszeichnen, etc) werden dann auch gleich
entfernt, wenn diese nicht benötigt werden.
Grüße,
Oliver
u8g2 schrieb:> Jedoch würden die nicht verwendeten Fonts im Flash-Speicher deines> Controllers landen, wenn man dem Linker nicht sagen würde, dass eben> diese nicht verwendeten Fonts weggelassen werden können.
Wenn das nötig ist, hat entweder derjenige, der die Library erstellt
hat, massiv geschlafen und alle Fonts in eine gemeinsame Objektdatei
gepackt, oder der Linker ist einfach kaputt.
Es ist schon immer das Standardverhalten eines Linkers, daß er aus
einer Library nur die benötigten Objektdateien extrahiert umd zum
Programm hinzufügt, niemals wird die komplette Library zum Programm
hinzugefügt. Linker, die nicht mehrere Jahrzehnte alt sind, sind auch in
der Lage, einzelne Funktionen oder Objekte aus Objektdateien zu
extrahieren, das nennt sich dann u.a. "function level linking".
Alternativ kann es natürlich sein, daß hier die --sorry--
Arduino-Deppen* mit ihrem kaputten Sprachgebrauch für "Library" den
Threadstarter dazu gebracht haben, zig Sourcefiles zu seinem Projekt
hinzuzufügen statt eine tatsächliche Library zu verwenden.
Dann sieht der Linker keine Library (*.lib bzw. *.a) und erzeugt in der
Tat riesige Programmdateien.
Frage an den Threadersteller:
Heißt Deine Library "libu8glib.a" und übergibst Du sie dem Linker mit
"-lu8gblib"?
*) gemeint sind nicht die Nutzer, sondern die Erfinder, die den
Begriff Library im C/C++-Sinne falsch verwenden. Die Diskussion hatten
wir schon.
Rufus Τ. F. schrieb:> Frage an den Threadersteller:> Heißt Deine Library "libu8glib.a" und übergibst Du sie dem Linker mit> "-lu8gblib"?
Ich verwende die u8glib_avr_v1.18.1
Diese Ordner habe ich extrahiert und die gesammten c-files inkl. u8g.h
in mein Projektverzeichnis kopiert.
Dem Linker habe ich explizit nichts mitgeteilt! Muss ich hier überhaupt
etwas machen?
M. G. schrieb:> Dem Linker habe ich explizit nichts mitgeteilt! Muss ich hier überhaupt> etwas machen?
Meines Wissens nicht ... Verwende auch oft Fonts, die einfach in C als
Arrays definiert sind und lösche die alten nie raus, weil sie eh nicht
reingelinkt werden, wenn sie nicht benötigt werden - obwohl sie
kompiliert werden.
u8g2 schrieb:>> Kannst du mir hierzu bitte genaueres sagen?> Jedoch würden die nicht verwendeten Fonts im Flash-Speicher deines> Controllers landen, wenn man dem Linker nicht sagen würde, dass eben> diese nicht verwendeten Fonts weggelassen werden können. Genau das macht> der Garbage Collector des Linkers.
Der Garbage Collector des Linkers ist bei mir aktiviert! (siehe Bild)
Optimierungsgrad des Compilers ist auf Optimze for size (-Os)
eingestellt.
Im Verzeichnis Libraries steht libm (Bild Lib_2).
Muss ich hier dem Linker noch etwas mitteilen?
Ach ja, so sieht mein benutzer Speicher nach dem Compilieren aus:
Program Memory Usage : 7222 bytes 88,2 % Full
Data Memory Usage : 490 bytes 47,9 % Full
Rufus Τ. F. schrieb:> Linker, die nicht mehrere Jahrzehnte alt sind, sind auch in> der Lage, einzelne Funktionen oder Objekte aus Objektdateien zu> extrahieren, das nennt sich dann u.a. "function level linking".
Damit der allseits beliebte gcc und gnu ld das machen muss man ihnen mit
den erwähnten Flags -ffunction-sections -fdata-sections und
-Wl,--gc-sections unter die Arme greifen.
Ob die Flags nun im gcc Spec-File steht, man es auf der Kommandozeile
oder wo auch immer angeben muss, hängt leider davon ab wer wie den GCC
gebaut hat.
> Alternativ kann es natürlich sein, daß hier die --sorry--> Arduino-Deppen* mit ihrem kaputten Sprachgebrauch für "Library"
Nicht nur für Library. Ich sage nur "sketch" ...
Jack schrieb:> Damit der allseits beliebte gcc und gnu ld das machen muss man ihnen mit> den erwähnten Flags -ffunction-sections -fdata-sections und> -Wl,--gc-sections unter die Arme greifen.>> Ob die Flags nun im gcc Spec-File steht, man es auf der Kommandozeile> oder wo auch immer angeben muss, hängt leider davon ab wer wie den GCC> gebaut hat.
Kannst du mir bitte sagen, wie ich das in AtmelStudio7 genau machen muß?
M. G. schrieb:> Kannst du mir bitte sagen, wie ich das in AtmelStudio7 genau machen muß?
Ich glaube nicht, dass Du etwas falsch machst. Ausser: Du benutzt
einfach einen mc mit einem viel zu kleinen Flash-Speicher.
Der von Dir benutzte Font hat eine Größe von 7816 Bytes, da passt nicht
mehr viel Programm daneben ins Flash:
https://github.com/olikraus/u8glib/wiki/fontgroupoldstandard
Wie Du in o.g. Liste siehst, gibt es auch reduced Fonts, die nicht alle
Zeichen beinhalten und entsprechend kleiner sind. Teste mal mit osr18n,
da sind nur Zahlen und Rechenzeichen drin, der hat nur 613 Bytes.
Nochmal:
Mit einem so kleinen Flash wirst Du bei einem Graphik LCD niemals auf
einen grünen Zweig kommen. Die einzig denkbare Lösung wären ev.
intelligente Displays wie Nextion o.ä.
Viele Grüße, Stefan
Stefan K. schrieb:> Mit einem so kleinen Flash wirst Du bei einem Graphik LCD niemals auf> einen grünen Zweig kommen.
Ich verwende nun einen ATMega328 -> damit funzt es :-)