@sternst : Ja, da haste recht, in Assembler brauche ich den Stack weniger da kann man mir den Registern schon unheimlich viel machen
achso verstehe
Der Stackrahmen der ISR wird zwar beendet, aber der "Müll der Mutterfunktion", wie du es genannt hast ist noch da - das klingt einleuchtend!
@sternst : Ja, da haste recht, in Assembler brauche ich den Stack weniger da kann man mir den Registern schon unheimlich viel machen
Signatur??? kann ich mir nicht leisten!!!
@ Manu
Oder du machst es eben mit setjmp() am Anfang der mainLoop() und einen longjmp() in der ISR. Siehe auch http://en.wikipedia.org/wiki/Longjmp#Simple_example
MfG Mark
Hab mir grade den wiki-artikel durchgelesen...
das scheint ja genau das zu sein, was ich suche:
"to provide 'non-local jumps', or control flow besides the usual subroutine call and return sequence."
"A problem with the use of setjmp/longjmp is that cleanup" - könnte das vielleicht auch ein problem mit dem "stackmüll" geben?
naja jedenfalls nochmal vielen dank an alle, die mir bisher geantwortet haben
ich mach mir erstmal nen kaffe - will irgendwer einen?
Nein, mit dem Stack hast du bei setjmp/longjmp keine Probleme. Das "cleanup" bezieht sich auf "höhere Ebenen", z.B. Dateien, die offen bleiben, oder Speicher, der nicht mehr freigegeben wird.Zitat von Manu_91
Trotzdem solltest du über eine Umstrukturierung deines Programms nachdenken. Der Wunsch, Funktions übergreifend herumzuspringen, ist fast immer das Resultat eines "vermurksten" Grundkonzepts. Es gibt nur sehr wenige wirklich sinnvolle Anwendungsfälle für setjmp/longjmp.das scheint ja genau das zu sein, was ich Suche
MfG
Stefan
Ich löse sowas meistens mit einem JobStack. Du legst in der ISR einen Pointer, der auf die Funktion zeigt, die ausgeführt werden soll, auf den JobStack. Den JobStack arbeitest du dann in der Main-Loop ab. Damit ist die Funktion aus dem Interrupt-Kontext gelöst und du hast kein Problem mit unaufgeräumten Stacks und anderen Laufzeit-Problemen, da alles mit C-Board mitteln gelöst wird.
Lesezeichen