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
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.
@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.
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.
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.