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