Wolfgang R. schrieb:
> In C scheib man ein GOTO auf Label am Ende der ISR. Ist zwar nicht schön
> aber der der Compiler wird den Stack und alle gesicherten Register
> richtig abräumen bevor das rti kommt. Jeder Assembler Programmierer
> würde die wohl ähnlich lösen.
Nein.
Tus nicht.
Mach einfach einen return und gut ists. Der Rest ist Sache des
Compilers. Im Regelfall solltest du dich als C-Programmierer nicht darum
kümmern müssen, was auf Maschinenebene abgeht. Bei einigen Dingen geht
das prinzipbedingt nicht, zb atomarer Zugriff. Hier ist das Verständnis
dessen was auf Maschinenebene passiert wichtig.
Über das, was bei einem Funktionsaufruf vor sich geht, sollst du dich
als Programmierer nicht kümmern müssen. Das ist Sache des Compilers.
Auch bei Spezialfunktionen wie einer ISR. Der Compiler hat alle
Informationen, die er braucht um eine ISR in allen Fällen korrekt
abzuwickeln. Für dich als Programmiererist eine ISR einfach nur eine
Funktion, die magisch beim Eintreten von bestimmten Bedingungen
aufgerufen wird. Mehr nicht. Es ist eine Funktion wie jede andere. Dein
einziger Gedanke sollte sich darauf richten, was kann ich in der ISR
erledigen und was nicht. Wann verbrauche ich in einer ISR zu viel Zeit,
so dass ich die CPU zu lange mit der ISR sperre, bzw. Gefahr laufe
andere Ereignisse zu verpassen.
Aber um Dinge wie Interrupt Flags sichern und wiederherstellen oder den
Unterschied ret/reti willst und sollst du dich als C-Programmierer nicht
kümmern.