Aber warum steht dann in einem Buch über PIC´s das beim Rücksprung die Adresse in den Programmcounter geladen wird und danach vom Stack gelöscht wird?
Keine Ahnung, aber letztendlich ist die Darstellung, daß irgendetwas vom Stack „gelöscht“ wird, schlichtweg falsch. Wie bereits dargelegt, ist es im Prinzip vollkommen unerheblich, ob der Inhalt des Stacks gelöscht wird oder nicht. Mir ist zudem kein Hard- oder Softwarestack bekannt, der explizit freigegebene Adressen „löscht“. Der dafür notwendige Overhead (sei es in Hard- oder Software) ist nicht zu rechtfertigen, da es bei bestimmungsgemäßen Gebrauch nicht zu einer derartigen Situation kommen kann. Sobald ein Stack überläuft, ist das Verhalten eh mehr oder weniger zufällig. Wichtiger als das „Löschen“ ist daher eine Möglichkeit zu erkennen, ob der Stackpointer im vorgesehenen Bereich bleibt oder nicht.
Ein Sprung nach 0x0000 (bzw. dem Resetvektor des jeweiligen Controllers) beim Stacküberlauf ist meines Erachtens keine wirkliche Lösung, da er grobe Fehler im Programm möglicherweise verdecken kann. Bei einem Stack, der lediglich Rücksprungadressen speichert, mag ein Wert, der dem Reset-Vektor entspricht vielleicht noch sinnvoll sein, aber was ist ein wirklich sinnvoller Wert für einen Stack, der zudem Werte von lokalen Variablen und Funktionsparametern beinhaltet (wie bei den meisten C-Compilern)?
Die 12- und 14-Bit PICs (Anzahl der Bits bezogen auf die „instruction size“, d.h. PIC12 und PIC16) bieten keine Möglichkeit, einen Overflow oder Underflow des Hardwarestacks zu erkennen. Die PIC18 erkennen zumindest einen Overflow des Hardwarestacks (STKFUL-Bit gesetzt oder automatischer Reset, je nach Einstellung der Configuration Bits).
Bei den dsPIC30F, dsPIC33F, PIC24H und PIC24F führt sowohl ein Overflow des Stacks als auch ein Underflow des Stacks zu einer „Trap“, d.h. einem „non maskable interrupt“ (NMI). In der Standardeinstellung der meisten Compiler (ohne explizite ISR für diese „Trap“) führt das auch zu einem Reset, aber durch eine entsprechende ISR ist ein deratig genereller Fehler im Programm relativ leicht zu erkennen und zu beheben.
Viele Grüße
Bernd