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 */

}

 

 

 

Ultime modifiche: mercoledì, 10 gennaio 2024, 18:15