Forum: Mikrocontroller und Digitale Elektronik OLED Display 128x64 - Fehlermeldung "text will not fit in region text"


von M. G. (ixil96)


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?

von Stefan F. (Gast)


Lesenswert?

Mit "text" meint der Compiler vermutlich den Programmcode, der nicht in 
den Flash Speicher passt.

Der ATmega88 hat ja nicht gerade viel Flash.

von Mampf F. (mampf) Benutzerseite


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.

von u8g2 (Gast)


Lesenswert?

Wichtig ist es die Garbage Collection des Linkers zu aktivieren:

    [All Files]
        -ffunction-sections
        -fdata-sections
    [Linker Options]
        -Wl,--gc-sections

von hier: https://github.com/olikraus/u8glib/wiki/avr

Bzw meine alte Beschreibung zum Atmel Studio:
https://github.com/olikraus/m2tklib/wiki/as6

Oliver

von M. G. (ixil96)


Lesenswert?

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?

von u8g2 (Gast)


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

von Mampf F. (mampf) Benutzerseite


Lesenswert?

u8g2 schrieb:
> mehrere hundert Fonts

Oh, hört sich interessant an! :)

von Rufus Τ. F. (rufus) Benutzerseite


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.

von M. G. (ixil96)


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?

von Mampf F. (mampf) Benutzerseite


Lesenswert?

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.

von M. G. (ixil96)


Angehängte Dateien:

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

: Bearbeitet durch User
von Jack (Gast)


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

von M. G. (ixil96)


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ß?

von Stefan K. (stefan64)


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

von M. G. (ixil96)


Lesenswert?

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

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.