Come fa notare PaoloP ci possono essere altri motivi che ci portano a salvare SREG. La domanda è:
Siamo davvero così infallibili da ricordarci cosa abbiamo scritto nella funzione x tre mesi fa, io no.
Io l'ho scritta non la guardo da tre mesi e ora mi viene in mente che posso usarla nel codice di esempio.
void loop(){
uint8_t oldSREG = SREG;
cli();
fuctionVeryOld();
Pos = encoderPos; // ops doveva essere eseguita atomicamente.
SREG = oldSREG;
if(Pos != oldPos){
Serial.println(Pos,DEC);
oldPos = Pos;
}
delay(1000);
}
Se functionVeryOld disabilita con cli() ed esegue codice e poi prima di uscire riabilita gli interrupt con sei()
si verifica il problema. Mi ritrovo ad eseguire codice con gli iterrupt abilitati quando e chiaro che io li ho disabilitati, chi li riabilita?
Qui è semplice capire che fuctionVeryOld() potrebbe essere la causa, e allora vado a vedere il codice sorgente,
nel caso io non l'avessi il codice sorgente quella funzione è da considerare buggata.
Siamo davvero in grado si seguire l'evoluzione del codice a mente e ricordarci tutto?
Io non me la sento di rischiare e allora uso la macro, che salva SREG e lascia l'ambiente nello stesso modo in cui
lo ha ricevuto.
Altro motivo per usare la macro:
Salvo SREG, cli() e mi dimentico di ripristinare lo stato di SREG.
Con la macro la dimenticanza non può proprio verificarsi e al massimo mi scordo a chiudere } e
il compilatore me lo segnala.
Quindi io raccomando di usare la macro anche in ambiente arduino. Come detto nel libro l'esempio è
didattico e ci sta mostrare i passaggi.
Ciao.