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


von Gino B. (gin)


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

von Rufus Τ. F. (rufus) Benutzerseite


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?

von Gino B. (gin)


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.

von Peter (Gast)


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

von Gino B. (gin)


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.

von Peter (Gast)


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

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.