Forum: Mikrocontroller und Digitale Elektronik ATmega2560, Speicher voll bei Program: 30% Data 8%


von Eric (Gast)


Lesenswert?

Hallo,

ich habe ein 3,25" Display an einem ATmega2560 in Betrieb. Auf dem 
Display gibt es mehrere Seiten zum Durchschalten. Jede Seite hat ein 
Hintergrundbild und darauf werden dann informationen dargestellt.

Jetzt habe ich folgendes Problem: Sobald mein 'Program' Speicher über 
30% voll ist werden nurnoch meine Grafiken fehlerfrei Dargestellt und 
die Schrift ist nurnoch Ameisenkrieg. Nehme ich ein Hintergrundbild 
heraus (auch wenns von einer Seite ist, die gerade nicht dargestellt 
wird, funktioniert wieder alles perfekt.

Alle Bilder habe ich als Header Files eingebunden und als unsigned int 
bzw. char PROGMEM abgespeichert.

Weis jemand rat? Ich bin am verzweifeln, muss noch zwei Seiten schreiben 
und ich kann keine Grafiken mehr einbinden :/

Vieeelen vieelen Dank vorab!

AVR Memory Usage
----------------
Device: atmega2560

Program:   72578 bytes (27.7% Full)
(.text + .data + .bootloader)

Data:        646 bytes (7.9% Full)
(.data + .bss + .noinit)

von Simon B. (nomis)


Lesenswert?

Eric schrieb:
> Jetzt habe ich folgendes Problem: Sobald mein 'Program' Speicher über
> 30% voll ist werden nurnoch meine Grafiken fehlerfrei Dargestellt und
> die Schrift ist nurnoch Ameisenkrieg. Nehme ich ein Hintergrundbild
> heraus (auch wenns von einer Seite ist, die gerade nicht dargestellt
> wird, funktioniert wieder alles perfekt.

Das hat bestimmt nix mit dem Program+Data-Speicher (also dem Flash auf 
dem AVR) zu tun. Ich tippe darauf, dass Dir das RAM ausgeht, vermutlich 
kopierst Du Dir ohne es zu merken einen Teil Deiner Nutzdaten (z.B. den 
Font - der geht ja anscheinend kaputt) ins RAM.

Für alles weitere bräuchte man den Sourcecode.

Viele Grüße,
        Simon

von Eric (Gast)


Lesenswert?

hey, danke für die schnelle Antwort. Ja, das ist gut möglich, aber meine 
Informationen werden alle dargestellt. Die kommen vom CANbus, werden 
umgerechnet und zum großen teil über dtostrf auf das Display 
geschrieben. Das funktioniert auch zuverlässig für alle seiten, erst 
wenn ich noch eine größere Datei (z.B. nen Bild) mit compiliere - egal 
ob ichs anzeigen lasse oder nicht - zerhauts mir den ganzen Text.

den source code darf ich leider nicht einfach veröffentlichen :/

von Karl H. (kbuchegg)


Lesenswert?

Ich denke auch, dass du irgendwo (unabsichtlich) eine Menge SRAM 
verbrauchst. zb die Bildanzeige. Kann es sein, dass du da zwischendurch 
ein großes Array im Speicher anlegst, das Bild als ganzes aus dem Flash 
dorthin kopierst und dann vor dort die eigentliche Ausgabe machst? Das 
würde (unnötigerweise) eine nicht geringe Menge SRAM verbrauchen, 
wodurch du dir den Stack zerschiesst.


Auch wenn du dein ganzes Programm nicht heerzeigen kannst, dann müsste 
es doch möglich sein, zumindest die relevanten Ausschnitte zu zeigen. 
Ohne Code kann dir keiner suchen helfen. Da hättest du dir die Anfrage 
auch gleich sparen können.

von Eric (Gast)


Angehängte Dateien:

Lesenswert?

also so wie ihr das schreibt und anhand dessen was ich übers googlen 
rausbekommen habe bin ich mir sicher, dass das mein Fehler ist. Ich haue 
sicher den SRAM voll, weis aber nicht wie ich das beheben könnte.

Habe hier mal einen Teil des Programmcodes genommen, nur paar namen 
rausgenommen und relevante teile umbenannt. Müsste passen. Ist nur die 
erste Seite, aber die anderen sind ähnlich aufgebaut.
Habe noch die beiden anderen Dateien angehangen, das eine ist ein 
Beispiel für ein Bild, in der anderen steht die funktion zum Bild 
drinen.

von Karl H. (kbuchegg)


Lesenswert?

Die Funktion

LCD_Bitmap_256high

wie sieht die aus?

Komm schon. Poste alles. Kein Mensch klaut dir das Programm, so gut ist 
das dann auch wieder nicht.
Wir suchen Funktionen, in denen großere Mengen von lokalen Variablen 
benutzt werden. Irgendwelche große Arrays.
Welche Funktionen dafür in Frage kommen, kann man bis jetzt nur raten: 
Alles wo größere Datenmengen bewegt werden. Bilder, Fonts sind erst mal 
heiße Kandidaten.

von Eric (Gast)


Lesenswert?

hm diese kann ich leider nicht einstellen, da die Funktionen vom 
Displayhersteller mit bereitgestellt wurden. ich schicke dir gern ne PM 
mit der Funktion, wenn du dich dem weiter annehmen würdest. Bin total 
begeistert um diese Uhrzeit noch Hilfe zu bekommen. Vielen Dank dafür.

Das steht im Quelltextkopf:/
/ You received an individual source code license for this display 
library.
// You are allowed to use these routines in any project, even commerical 
ones
// without paying any license fee s long as you never pass this source 
code to anybody else !
// You may pass your compiled program of course.
//
// This license includes the need for you to keep the following lines in 
your source.
// This means, you are not allowed to delete the following 8 lines. 
These are needed to prevent
// you of forgetting the fact that you are not allowed to pass this file 
to anybody in a readable form.

von berndbrot (Gast)


Lesenswert?

Sind (Hintergrundbild+Font) zufaellig groesser als 64kB? Wie greifst Du 
auf den Font zu? pgm_read_byte oder pgm_read_byte_far etc? PGM_P pointer 
gehen nur bis 64kB etc...

von Michael S. (schiko)


Lesenswert?

Eric schrieb:

> wenn ich noch eine größere Datei (z.B. nen Bild) mit compiliere - egal
> ob ichs anzeigen lasse oder nicht - zerhauts mir den ganzen Text.

Dann schau doch mal in den Speicher im Debugger oder Simulator
wo, bzw wann in welcher Funktion sich der Stackpointer, den Daten 
annähert. (Der Stackpointer kommt von oben)

Ich würd es mit kleinen BMPs probieren, die im Speicher anhand von
Bitfolgen schnell zu lakalisieren sind.

Sind die Bmp eventuell komprimiert und müssen in der LDC_Bitmap()
erst entpackt werden?

von Eric B. (modder)


Lesenswert?

ähm Zugriff geschieht über pgm_read_byte

const unsigned char Byte = pgm_read_byte(&FD->FontInfo.Data[ByteIndex]);
...
//if (FD->FontInfo.PosTable == NULL) return; // bad font
      unsigned int CharDataIndex = 4+pgm_read_word(&FD->FontInfo.Data[4 
+ (Ch - BASE)*2]);
      const unsigned char ColCount = 
pgm_read_byte(&FD->FontInfo.Data[CharDataIndex]);

usw.
der font ist ~15kb und meine Bilder habe ich in mehrere kleine Dateien 
aufteilen müssen, da die sonst nicht dargestellt werden. Jedes Bild 
einzeln ist kleiner als 64kb, aber alle zusammen sind locker größer als 
64kb, allein die Startseite hat auf meiner Festplatte von 56kb

@ Michael
#EDIT
ja, die bmps sind komprimiert, sollte ich mal ohne probieren ? dann 
werden die Dateien aber locker 5-6x größer pro Stück. Wegen 
'stackpointer' muss ich mal gucken, ich programmiere noch nicht lange, 
sagt mir gerade noch nichts ^^

von Michael S. (schiko)


Lesenswert?

Mit den gepackten BMPs meine ich, dass die eventuell im Stück
entpackt werden , und Dir den Stack vollknallen.
Du hast nur 8kb für data und stack zusammen! ...sofern ohne externen 
Ram.

von berndbrot (Gast)


Lesenswert?

pgm_read_byte/word nehmen einen uint16_t als Adresse, das geht nur bis 
max 64kB Daten im Flash. Siehe 
http://www.nongnu.org/avr-libc/user-manual/pgmspace_8h.html. Wenn Daten 
jenseits der ersten 64kB im Flash liegen, geht nur pgm_read_xxxx_far. 
Ich vermute, durch mehr von Deinen Hintergrundbitmaps ist Dein Font 
jenseits der 64kB-Grenze gerutscht und jetzt liest Du Daten an (adresse 
modulo 65536) was natürlich nicht das gewünschte Ergebnis hat. 
Normalerweise sortiert der Linker so, dass die .data section so weit 
unten im Flash liegt wie moeglich.

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.