Come salvare la stato della macchina all'ingresso di una routine di interrupt?

Buongiorno,

Il problema che mi sono creato è: Come salvare la stato della macchina all'ingresso di una routine di interrupt?

Ho letto da qualche parte (e giustamente) che la prima cosa da fare in una routine di servizio di un interrupt è salvare il contenuto dei registri di macchina per poterli poi ripristinare all'uscita.

Per questa funzione nell'assembler delle macchie a stack esistono due specifiche istruzioni, push e pop, ma a me sembra che nel c/c++ di Arduino queste non esistano (né potrebbe essere diversamente, visto che il c/c++ astrae l'architettura hardware del processore).

Ho immaginato che forse il compilatore aggiunge automaticamente il codice necessario per queste funzioni, ma non ne sono sicuro.

Potreste darmi qualche indicazione in merito a questo (presunto) problema?

Grazie mille.

Domenico Formenton

Please post your question in the Italiano section. Or you can write it in English so the majority here can understand.

Non c'è alcun problema, il programmatore e esonerato da questo compito che viene gestito in automatico da compilatore.
Di natura simile sono i problemi che si devono affrontare quando si sviluppa un sistema operativo RTOS, ma non sono in grado di dipanare la matassa peraltro molto ingarbugliata.

Cosa più semplice e gestibile invece è rendere un blocco di codice non interrompibile, forzando l'atomicità delle operazioni. In breve disabiliti globalmente gli interrrupt allora esegui codice protetto e poi riabiliti globalmente gli interrupt. Il codice protetto non può esssere interrotto da una richiesta di interrupt che rimane pendente e verrà onorata alla riabilitazione globale degli interrupt.

Puoi miscelare codice "asm" e codice C/C++, puoi usare asm inline, oppure scrivere direttamente un modulo in asm, e/o leggere/scrivere in modo arbitrario nella memoria RAM, sia in quella mappata che quella che "riservata" in cui c'è lo stack o comunque in generale su ogni indirizzo reale, perchè non c'è Protect Mode e altre cose tipiche dei PC.

Ciao.

dformenton:
Ho immaginato che forse il compilatore aggiunge automaticamente il codice necessario per queste funzioni, ma non ne sono sicuro.

E' così. Come ti ha spiegato Mauro, il compilatore lo fa "di nascosto", per cui tu non devi preoccuparti da salvare e poi ripristinare lo stato della CPU (registri, stack, PC ecc).

Ah, riallacciandomi al discorso dell'atomicità fatto sempre da Mauro, ricordati che una ISR è per default atomica, quindi non è interrompibili da un altro interrupt.