basta usare le classiche pseudofunzioni sei() e cli().
Codice: Seleziona tutto
cli(); // enter critical section
// non atomic code
sei(); // leave critical section
Personalmente non ho mai usato arduino, però col compilatore IAR, mi ricordo che funzionavano senza problemi.
Casomai c'è da approfondire un'attimo la questione di cosa succede dopo l'esecuzione della sei(); se non ricordo male
l'istruzione successiva alla sei() viene sempre eseguita anche se c'è un interrupt in attesa (pending interrupt)
edit:
forse la cosa migliore per evitare problemi è far seguire la sei() da un'istruzione NOP, che però mi sa che non è presente come pseudo funzione e va scritta in asm
__asm__ __volatile__ ("nop\n\t"); oppure meglio creare una macro:
Codice: Seleziona tutto
#define _NOP() __asm__ __volatile__ ("nop\n\t");