Forum: Mikrocontroller und Digitale Elektronik Heap und Stack Einstellungen beim LPC23xx


von Breezer D. (breezer71)


Lesenswert?

Hallo
Ab und zu erhalte ich eigenartige Fehlermeldungen die nicht immer ganz 
klar sind. Ich denke es könnte mit falschen Heap und Stack Einstellungen 
zusammenhängen. Wie ist das Vorgehen um diese beiden Einstellungen 
korrekt zu definieren bzw. wie kann ich sicher gehen ob diese Fehler 
wirklich die Ursache im Heap oder Stack haben?
danke

Gruss breezer

von Stefan++ (Gast)


Lesenswert?

Hallo,

zu wenig Informationen selbst für die Glaskugel
welche Fehlermeldung, wann und wo treten sie auf???

heap ist gewöhnlich der gesamte Bereich zwischen Oberkante Variablen 
(meist bss) und Unterkante Stack

Zu kleinen Stack merkt man erst zur Laufzeit meist durch fatalem Absturz 
ohne jede Fehlermeldung


also was ist ???

von Breezer D. (breezer71)


Lesenswert?

Hallo
Demzufolge sind es Fehler welche aufgrund eines zu kleinen Stack 
entstanden sind. Es sind Fehler entstanden welche nicht reproduziert 
werden konnten. Je nachdem was dann angepasst wurde funktionierte es 
dann wieder. Hier ein Auszug aus dem Map File:

0x40001220   0x00000060   Zero   RW    174    .bss   libspace.o(c_t.l)
0x40001280   0x00001000   Zero   RW      2    HEAP   lpc2300.o
0x40002280   0x000019c0   Zero   RW      1    STACK  lpc2300.o

Beim LPC2366 ist der RAM Bereich von 4000 0000 bis 4000 7FFF. d.h. ich 
könnte den Bereich von 7FFF auf den Heap und Stack verteilen. Im Moment 
wird nur bis 2280+19c0=3c40 das RAM belegt. Hab ich  das richtig 
verstanden?

danke

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Wird dynamisch Speicher vom Heap angefordert (evtl. "versteckt" durch 
stdio-Funktionen)? Gibt es Funktionen, in denen größere Felder lokal 
genutzt werden? Gibt es größere Verschachtelungstiefen an 
Funktionaufrufen? Rekursionen? Exception-Stacks ausreichend 
dimensioniert (z.B. für IRQ)? Werden in ISRs weitere Funktionen 
aufgerufen? Evtl. in ISR oder von daraus aufgerufenen Funktionen viel 
Platz für lokale Variablen erforderlich?

Ohne zumindest Linkerscript und Startupcode (mit den 
Stackinitialisierungen) zu sehen, kann man wenig weiterhelfen - wie von 
Stefan++ ja bereits angemerkt.

Im Zweifel die Stacks bei ORIGIN(RAM)+LENGTH(RAM) beginnen lassen und 
den HEAP weiterhin am Ende von BSS und die Exception-Stacks (zumindest 
IRQ) vergrößern.

von Breezer D. (breezer71)


Angehängte Dateien:

Lesenswert?

Das Programm ist recht umfangreich. Ich habe dies so übernommen und habe 
einfach den Durchblick noch nicht. Im Anhang ist das Map File und der 
Startup code. Danke für eure Hilfe.

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Breezer Dw schrieb:
> Das Programm ist recht umfangreich. Ich habe dies so übernommen und habe
> einfach den Durchblick noch nicht. Im Anhang ist das Map File und der
> Startup code.

Falls es wirklich der für die Stacks reservierte Speicher nicht 
ausreicht, kann man die Werte hinter IRQ_Stack_Size (für Stack, der bei 
IRQs genutzt wird) und USR_Stack_Size (für Stack, der im "normalen" 
Programmablauf genutzt wird) vergößern. Für Heap analog der Wert bei 
Heap_Size.

Bei Sorgen kann man sich aber sicher auch an den ARM/Keil-Support 
wenden.

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.