OLED Display 128x64 - Fehlermeldung "text will not fit in region text"

OP #5203786
Lesenswert?

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?
Persönliche Seite #5203801
Lesenswert?

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.
Gast #5204355
Lesenswert?

> 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
Persönliche Seite #5204681
Lesenswert?

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.
OP #5204720
Lesenswert?

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?
OP #5204741
Lesenswert?

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
Angehängte Dateien:
Gast #5204780
Lesenswert?

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" ...
OP #5204788
Lesenswert?

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ß?
#5204807
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren