www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SP (Stack Pointer) auslesen msp430


Autor: Gino B. (gin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

Ich möchte gern beim Start den Stack initialisieren. Dabei muss ich 
darauf achten wo der Stack Pointer gerade steht.
Leider finde ich nirgens, wie man den Stack Pointer auslesen kann. Der 
liegt in Register R1. Aber so wie das Lesen von z.B. USART-Registern 
funktioniert das Lesen des SP nicht.
Hat jemand von euch eine Idee oder das schon mal gemacht?

(Benutzte den MSP430F449)

Grüße Gin

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich möchte gern beim Start den Stack initialisieren.

Solltest Du C verwenden, macht das der Startup-Code.

Wenn nicht, dann wird dies gewiss in einem der zahlreichen 
Quellcode-Beispiel von TI zu finden sein, such Dir halt eines aus, in 
dem Interruptroutinen verwendet werden, die funktionieren nicht ohne 
Stack.

> Dabei muss ich darauf achten wo der Stack Pointer gerade steht.

Wieso?

Autor: Gino B. (gin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Solltest Du C verwenden, macht das der Startup-Code.

Ich verwende C. Der Startup Code setzt den Stack nur beim Debuggen auf 
0xCD. Ohne Debugger stehen bei jedem Start etwas anderes drin.

Wenn ich einen Interrupt auslösen würde, push man doch nur die wichtigen 
register auf den stack. Wo der Pointer dabei gerade steht ist 
nebensächlich oder?

> > Dabei muss ich darauf achten wo der Stack Pointer gerade steht.

> Wieso?

Weil ich keine Speicherstellen initialisieren kann auf die der Stack 
Pointer gerade zeigt oder die darunter liegen.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Trotzdem erschliesst sich mir noch nicht ganz, warum du den Stack 
initialisieren willst.

Die 0xCD wird von deiner IDE (ich vermute mal IAR) nur ausgefüllt, um 
während dem Betrieb zu ermitteln, ob der Stack voll ist.

Für dich und dein Programm ist nur der Stackpointer wichtig, der beim 
Eintritt in ein Unterprogramm zeigt, wo Parameter auf den Stack gelegt 
werden können.

Wenn du eine eigene stacküberwachung implementieren willst musst du nur 
den Start und die Größe deines Stacks wissen.


Peter

Autor: Gino B. (gin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richtig, Initialisieren zur Stacküberwachung. Dabei prüfe ich die 
letzten Stack Zellen auf deren Initialwert.
Diese Stack Zellen sollten laut Linker-File auch niemals erreicht 
werden.
Dann habe ich festgestellt, dass der Initialwert immer ein anderer sein 
kann. Deswegen dachte ich, initialisiere ich ihn halt selbst. Und aus 
größtmöglichster Vorsicht will ich beim Initialisieren wissen, wo der 
Stack Pointer steht, nicht dass der da schon auf diesen zu überprüfenden 
und deswegen zu initialisierenden Zellen steht.
Das Szenario ist zugegebenermaßen relativ unwahrscheinlich.

Habe die Initialisier-Routine jetzt dahin gelegt, wo ich mir relativ 
sicher bin, dass der SP an dieser Stelle immer weit weg von den zu 
Initialisierenden Zellen steht. Hoffe das klappt. Durch auslesen des SP 
wäre ich zu 100% sicher gewesen.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Größe von deinem Stack legst du beim Linken fest, das hat mit dem 
Stackpointer nix zu tun. Der Startwert des SPs wird beim cstart 
initialisiert. Dieser Startwert ist derivatabhängig und wird von der 
Entwicklungsumgebung (IAR / CCE?) gesetzt.
Zur Überwachung interessiert dich nur der hintere Teil des Stacks, der 
wird nach Start des Programms (noch) nicht verwendet.

Wenn du nur das Überschreiben des Stacks feststellen willst, reicht es 
das letzte Byte im Stack zu setzen.

Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.