Forum: Mikrocontroller und Digitale Elektronik Plötzlich Memory Overflow


von Matthias (Gast)


Lesenswert?

Ich hätt da mal wieder ein Problem. Ein Programm dass eigentlich schon 
funktioniert hat bringt jetzt beim compilieren einen Memory Fehler. Data 
Memory Usage war plötzlich bei 500%. Nach Löschen von drei von vier 
Fonts bin ich jetzt bei 130%. Wieso brauchen die Fonts jetzt auf einmal 
so viel Speicherplatz? Das einzige was ich an dem Programm geändert habe 
ist "prog_uchar" durch "unsigned char" zu ersetzen. Werden die Fonts 
durch die Änderung in den falschen Speicher geladen? Aber das hat ja 
auch schon mal funktioniert.

von Alex W. (Gast)


Lesenswert?

Das musst du in deinem Lua-Compiler richtig einstellen! Eventuell wird 
der Font in zwei verschiedenen Funktionen verwendet und deshalb nimmt er 
den doppelten Platz weg!

von Nichtdurchblicker (Gast)


Lesenswert?

Matthias schrieb:
> Werden die Fonts
> durch die Änderung in den falschen Speicher geladen?

Vermutlich ja.

Da du uns aber viele Details vorenthältst können wir das
nicht wirklich beurteilen.

von Jim M. (turboj)


Lesenswert?

Matthias schrieb:
> Das einzige was ich an dem Programm geändert habe
> ist "prog_uchar" durch "unsigned char" zu ersetzen.

Damit wandern die vom Flash in den RAM. Bei ARM könnte "const unsigned 
char" helfen, bei AVR reicht das eventuell nicht (Stichworte: Pointer 
und Havard Architektur).

von Oliver S. (oliverso)


Lesenswert?

Matthias schrieb:
> Das einzige was ich an dem Programm geändert habe
> ist "prog_uchar" durch "unsigned char" zu ersetzen.

Was hindert dich daran, das wieder zurückzuändern?

Oliver

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Matthias schrieb:
> Das einzige was ich an dem Programm geändert habe
> ist "prog_uchar" durch "unsigned char" zu ersetzen.

Mach das wieder rückgängig. Hinter dem Typ prog_uchar verbirgt sich 
bestimmt PROGMEM, was den Compiler veranlasst, die Fonts lediglich im 
Flash vorzuhalten. Deine Änderung bringt den Compiler dazu, die Fonts 
zur Laufzeit im viel zu kleinen RAM anzulegen. Peng!

von Matthias (Gast)


Lesenswert?

Habs gelöst. Rückgängig machen geht nicht da es den Befehl "prog_uchar" 
anscheinend in neueren Compilern nicht mehr gibt. (Fehlermeldung: kein 
zulässiger Name). Ersetzt werden muss er durch "const unsigned char 
_attribute_ ((progmem))". Dann funzt es. peng!!

von Forist (Gast)


Lesenswert?

Matthias schrieb:
> Ersetzt werden muss er durch "const unsigned char attribute ((progmem))".

Das hätte ich dir gleich sagen können, wenn ich gewußt hätte, um welchen 
Compiler es geht. :-(

von Peter D. (peda)


Lesenswert?

Matthias schrieb:
> Rückgängig machen geht nicht da es den Befehl "prog_uchar"
> anscheinend in neueren Compilern nicht mehr gibt.

Nö, das hat nichts mit dem Compiler zu tun.
Du hast einfach nur im Code das
1
#include <avr/pgmspace.h>
gelöscht.

von Leo C. (rapid)


Lesenswert?

> Du hast einfach nur im Code das
> #include <avr/pgmspace.h>gelöscht.

Muß nicht sein. Wahrscheinlich hat er nur eine neuere avr-libc 
installiert, und nicht (nur) einen neuen Compiler.


http://nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html
1
prog_uchar
2
3
Note
4
    DEPRECATED
5
This typedef is now deprecated because the usage of the __progmem__ attribute 
6
on a type is not supported in GCC. However, the use of the __progmem__ attribute 
7
on a variable declaration is supported, and this is now the recommended usage.
8
9
The typedef is only visible if the macro __PROG_TYPES_COMPAT__ has been defined
10
before including <avr/pgmspace.h> (either by a #define directive, or by a 
11
-D compiler option.)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Oliver S. schrieb:
> Matthias schrieb:
>> Das einzige was ich an dem Programm geändert habe
>> ist "prog_uchar" durch "unsigned char" zu ersetzen.
>
> Was hindert dich daran, das wieder zurückzuändern?

avr-gcc behandelt progmem als Variablen-Attribut, nicht als 
Typ-Attribut.

avr-gcc gibt nur deshalb keinen Fehler für progmem in Typen aus, weil 
das anno dulles mal (zufälligerweise) funktionierte und von der avr-libc 
per typedef unters Volk gebracht wurde.

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.