Forum: Mikrocontroller und Digitale Elektronik LPC 935: kurioser Stack


von Gustl B. (gustl319)


Lesenswert?

Hallo,

ich habe Code für einen LPC935 der manchmal abstürzt. Um den Fehler zu 
finden hab ich u.a. den Stack-Verbrauch angesehen. Dazu hab ich im 
IDATA-RAM von oben (0FFh) nach unten durchsucht bis das erste Byte 
ungleich 0h kommt.

Dabei ist mir aufgefallen das es Stack-Bytes gibt die bereits verwendet 
werden, also ungleich 0h sind, und dann wieder gelöscht werden. Gibts 
dafür eine Erklärung, oder ist das ein Hinweis auf Code der den Stack 
löscht/überschreibt?

Bin gespannt was ihr dazu meint.

Danke, Gustl

von Svenska (Gast)


Lesenswert?

Lokale Variablen in einer Funktion werden auf dem Stack alloziiert. Wenn 
die Funktion endet, wird der Stackpointer wieder auf den alten Wert 
zurückgesetzt, der Stack aber nicht mit Nullen überschrieben. Wenn du 
eine andere Funktion aufrufst, wird die die Daten eh wieder 
überschreiben.

von Gustl B. (gustl319)


Lesenswert?

@Swenska:

Ja, so seh ich das auch. Neben den Variablen sind auch noch die 
Return-Addresse, PSW, A, B und DPTR auf dem Stack. Die Return-Adresse 
ist auf keinen Fall 0h und bei den anderen wär es schon ein großer 
Zufall, wenn die alle 0h wären.

von Svenska (Gast)


Lesenswert?

Wenn du keine dynamische Speicherverwaltung benutzt, kannst du im 
Debugger den Stackpointer verfolgen und schauen, ob der jemals in einen 
Bereich zeigt, in dem deine Daten liegen. Mit 8051 kenne ich mich nicht 
aus.

von Gustl B. (gustl319)


Lesenswert?

Ich nutze keine dynamische Speicherverwaltung.
Ich glaube nicht das der Stack die Daten überschreibt. Er hat genügend 
Platz und es ist noch Reserve nach oben. Ich befürchte das es 
andersherum ist, das der Stack überschrieben wird und deshalb die 
Return-Adresse nicht mehr stimmt.

von Karl H. (kbuchegg)


Lesenswert?

Gustl B. schrieb:
> Ich glaube nicht das der Stack die Daten überschreibt. Er hat genügend
> Platz und es ist noch Reserve nach oben. Ich befürchte das es
> andersherum ist, das der Stack überschrieben wird und deshalb die
> Return-Adresse nicht mehr stimmt.

Das ist doch letzten Endes dasselbe. Die beiden Speicherbereiche 
kollidieren. Ob jetzt eine Stackoperation dir Variablen zerschiesst oder 
eine Zuweisung dir den Stack zerschiesst ist im Endeffekt nur eine Frage 
der konkreten Reihenfolge der Operationen. Aber die Ursache ist 
dieselbe.

Wenn das das Problem ist.

Was meinst du mit 'da ist noch Reserve nach oben'? Der Stack wächst 
normalerweise von oben nach unten. Oder meintest du mit 'Reserve' die 
Größe des STacks, dass die noch größer gemacht werden könnte?

: Bearbeitet durch User
von Lothar (Gast)


Lesenswert?

Karl Heinz schrieb:
> Was meinst du mit 'da ist noch Reserve nach oben'? Der Stack wächst
> normalerweise von oben nach unten.

Beim 8051 stimmt schon von unten nach oben.

von Gustl B. (gustl319)


Lesenswert?

Es ist ein HW problem. Der LPC 935 läuft mit 19,2MHz bei 3,3V. Der Takt 
ist über der Spezifikation (18MHz), aber bei 3,3V soll das gehen - sagt 
der HW-Entwickler.

Wenn ich auf den internen Takt schalte oder einen LPC9351 verwende 
funktioniert 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.