15.2.3 Coding ISRs

The following prototype declares function isr0 to be an interrupt handler:

void __attribute__((interrupt(auto_psv))) isr0(void);

As this prototype indicates, interrupt functions must not take parameters nor may they return a value. The compiler arranges for all working registers to be preserved, as well as the Status register and the Repeat Count register, if necessary. Other variables may be saved by naming them as parameters of the interrupt attribute. For example, to have the compiler automatically save and restore the variables, var1 and var2, use the following prototype:

void __attribute__((interrupt(auto_psv, save(var1, var2)))) isr0(void);

When using dsPIC33C/E/F and dsPIC30F devices, to request the compiler to use the fast context save (using the push.s and pop.s instructions), tag the function with the shadow attribute (see 14.1.1 Function Specifiers”). For example:

void __attribute__((interrupt(auto_psv, shadow))) isr0(void);