Den Stack manipulieren muss man IIMHO schon.

Das eigentliche Problem besteht darin, daß GCC in einer ISR schon Register sichert, bevor dein ISR-Code dran kommt. Du darfst also nicht direkt über den SP zugreifen, sondern musst einen unbekannten Offset berücksichtigen, um den Kontext der alten/neuen Task zu sichern/wiederherzustellen.

Prinzipiell gibt's mehrere Ansätze:
  1. Schreiben der ISRs in (Inline) Assembler. Bei Inline Assembler muss die Funktion naked sein und man muss sich selber um RETI und verwendete Register und das SREG kümmern.

    https://www.roboternetz.de/wissen/in...rolog.2FEpilog
  2. Wenn man komplett in C bleiben will, wird's schweirig und man muss zumindest wissen, was GCC mit dem Stapel angestellt hat. An diese Info ranzukommen ist recht tricky und wird leider in avr-gcc nicht korrekt unterstützt (__builtin_return_address(0)). Ein Ansatz wie man an die Info kommen kann findest du in

    https://www.roboternetz.de/wissen/in...address.280.29
    Dieser Workaround ist abhängig von der avr-gcc Version und davon, ob es sich um eine Funktion, eine ISR handelt. Auf jeden Fall ist das generierte asm zu kontrollieren, zB auf korrekte Offsets!

    https://www.roboternetz.de/wissen/in...te_von_avr-gcc