Le multitâche ou multitasking est la capacité d’un microcontrôleur d’exécuter plusieurs tâches ou process sur le même horizon de temps. En pratique, un Arduino ne peut pas exécuter de tâches en parallèle mais il peut agencer et exécuter une partie des tâches les unes à la suite des autres dans un laps de temps très court. Ceci donne l’illusion du multitâche. Nous allons voir dans cette article quelques exemples de méthode dite de multitâche.
S’il est nécessaire pour votre projet d’exécuter des tâches en parallèle (multithreading), il faudra vous orienter vers d’autres microcontrôleurs ou micro-ordinateurs.
Utilisation des interruptions
Description
Les interruptions permettent au microcontrôleur d’exécuter une fonction lorsqu’un évènement survient sur une des broches d’interruption. Plutôt que de lire constamment la valeur d’un capteur, le programme ne va se déclencher que lorsque la valeur du capteur va changer. Cela permet de résoudre bon nombre de problème d’agencement de tâche.
Code
const byte interruptPin = 2; void setup() { pinMode(interruptPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(interruptPin), onEvent, CHANGE); } void loop() { } void onEvent() { Serial.println(F("Action")); }
Utilisation de la fonction millis()
Description
La fonction millis() retourne une variable de type unsigned long représentant le nombre de millisecondes écoulées depuis la mise sous tension du microcontrôleur. Elle permet notamment d’effectuer une action lorsque un intervalle de temps est écoulée sans bloquer le reste du programme.
Code
unsigned long currentTime=0; unsigned long previousTime=0; bool ledState=LOW; void setup() { Serial.begin(9600); } void loop() { currentTime=millis(); if((currentTime-previousTime)>200){ previousTime=currentTime; Serial.println(F("Action ")); } }
Utilisation des Timers intégrés du microprocesseur
Les timers sont des registres du microcontrôleur qui s’incrémente à la réception d’une impulsion de l’horloge.
Utilisation des librairies Timer
Les librairies de gestions du temps en Arduino sont multiples . En règle générale, elle permettent de s’interfacer aux registres timer de l’Arduino. Pour citer les plus connues: TimerOne.h MsTimer2.h, TimerThree.h
Utilisation de librairie de gestions des tâches
Ces librairies permettent d’exécuter des tâches de manière ordonnées ce qui donne l’impression de faire du multithreading.
Quelques exemples : TaskManager, ProcessScheduler, ArduinoThread ou encore FreeRTOS. Retrouver ces librairies dans la liste référence d’Arduino.
Multitâche avec la carte Arduino Due
Pour les cartes basées sur une architecture SAM comme l’Arduino DUE, il existe une librairie qui permet de gérer plusieurs tâches dans des fonctions loop() différentes. Ceci fonctionne aussi pour les cartes Zero, MKRZero et MKR1000
Microcontrôleur multicœur: ESP32
Le microcontrôleur NodeMCU ESP32 est muni d’un microprocesseur avec deux cœurs et utilise l’OS FreeRTOS ce qui lui permet d’exécuter des tâches en parallèle.
Multithreading avec Raspberry Pi
Le Raspberry Pi est un micro-ordinateur, de ce fait il est capable d’exécuter plusieurs tâches en même temps. De plus, son microprocesseur est muni de quatre cœurs ce qui lui permet de faire du vrai multitâche. Vous pouvez, par exemple, lancer plusieurs scripts Python ou programmes C++ (ou autres) en même temps. Il est aussi possible d’utiliser les librairies de multithreading au sein d’un script Python