Ok, wenn du jetzt etwas mehr machst in foo (auf die Variable isr müsstest du pollen, also könnte man auch gleich auf die IRQ-Flags pollen und das ganze Interrupt-Zeug weglassen, was aber wiederum nicht geht...).

foo verändert z.B. das SREG -- es wird nicht wieder hergestellt!. Und wenn sich foo entscheidet, R0, R1, R18..R27, R30 oder R31 anzupacken, werden die auch nicht gesichert...

Im Endeffekt schaffst du nur mit Assembler, das wasserdicht zu bekommen, weil du von avr-gcc nicht erfahren kannst, welche Register er benutzt (oder doch?).