In der Regel sollte die ISR schon kurz sein und nicht auf etwas externes warten. Wenn ein Interrupt zeitkritisch ist, muß man eventuell sogar die ISR Routine sogar in Assembler schreiben, denn zumindest GCC erzeugt ziehmlich viel extra code am Anfang und Ende der ISR Rotine.

Es gibt aber auch Ausnahmen, wo man den Datenaustausch von der Interrupts Routine zu Hauptprogramm sparen kann.
Ich habe zum Beispiel eine Anwendung wo im Main Teil nur ein SLEEP in einer Endlosschleife ist. Die ISR Routine gibt 10 Sekunden lang etwas aus. Nach der ISR routine geht der Controller dann in den Tiefschlaf bis zum Nächsten externen Interrrupt.