Cosa si intende per blocking e non-blocking mode
In programmazione si parla di blocking mode o più brevemente di blocking quando l'esecuzione del flusso delle istruzioni si arresta in attesa di un evento che faccia ripartire il flusso.
Si parla invece di non-blocking mode o non-blocking quando il flusso delle istruzioni non si arresta anche se si è in attesa di un evento.
Un esempio banale di algoritmo blocking è lo sketch di Arduino che prevede l'accensione e lo spegnimento di un led con periodo di 2 secondi (il famoso "blink") utilizzando la funzione "delay(1000);" che arresta il programma per 1000 millisecondi per poi continuare il flusso delle istruzioni.
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
È evidente quali sono i due istanti nei quali il programma si arresta in attesa che passi 1 secondo e in questo intervallo di tempo qualsiasi evento non viene considerato, soprattutto si perde del tempo che invece potrebbe essere adoperato per svolgere altre attività o controlli.
Con l'uso di un timer (oramai sempre disponibile nei microcontrollori) che restituisce il tempo trascorso dall'inizio dell'esecuzione del programma e alcuni semplici variabili di appoggio è possibile svolgere le stesse operazioni senza mai arrestare il programma:
La codifica è la seguente:
unsigned long timenow;
unsigned long lastUpdate = 0;
unsigned long interval = 1000;
boolean statoLed = LOW;
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
timenow = millis();
if (timenow >= lastUpdate + interval){ // controlla se è passato 1 secondo
if (statoLed == LOW){
digitalWrite(LED_BUILTIN, HIGH);
statoLed = HIGH;
}
else{
digitalWrite(LED_BUILTIN, LOW);
statoLed = LOW;
}
lastUpdate = timenow;
}
/* qui potrebbero essere messe altre righe di codice che verrebbero eseguite ripetutamente senza alcuna attesa */
}