Free RTOS permet d’exécuter plusieurs tâches en “parallèle”
Vous souhaitez faire clignoter une LED toutes les x secondes, attendre la réception d’une trame sur une liaison série, lire des valeurs ADC etc … de nombreuses petites tâches qui vont transformer votre code en usine à gaz avec des délais parfois même bloquant.
Free RTOS va vous permettre de créer des tâches indépendantes à exécuter à intervalle régulier.
Si vous souhaitez faire clignoter une LED à 1Hz, vous avez la possibilité de faire :
while(1)
{
digitalWrite(LED, HIGH);
delay(500); // bloqué ici pendant 500ms
digitalWrite(LED, LOW);
delay(500); // bloqué ici pendant 500ms
}
delay() est bien souvent une fonction bloquante qui va demander à votre micro de tourner en boucle et ne fera rien d’autre jusqu’à que sa boucle soit terminée. (Cette méthode c’est le mal !)
Arduino propose aussi une méthode millis() qui renvoie le nombre de millisecondes écoulées depuis le démarrage du micro. Il s’agit d’un compteur qui est incrémenté par un timer.
Il est possible de comparer “l’heure” du début de notre tache (previousTime) à la valeur de millis() (currentTime) et si la différence est supérieur à X ms, alors X ms se sont écoulées. Le code n’est plus bloquant mais cela implique de créer un nombre important de variables et transformer votre code en usine à gaz si vous avez plusieurs taches à exécuter.
unsigned long currentTime=0;
unsigned long previousTime=0;
bool ledState=LOW;
while(1)
{
currentTime=millis();
if((currentTime-previousTime)>500){
previousTime=currentTime;
ledState=!ledState;
digitalWrite(LED,ledState)
}
//Ici on peut faire d'autres choses sans être bloqué
}
La 3ème solution utilisée dans tous les programmes un peu complexe c’est : l’OS temps réel comme Free RTOS.
while(1)
{
xTaskCreate(LedBlink,"Toggle LED",4096,NULL,1,NULL); //Création d'une tâche
xTaskCreate(FaireTruc2,"FaireTruc2",4096,NULL,1,NULL); //d'une 2ème
xTaskCreate(FaireTruc3,"FaireTruc3",4096,NULL,1,NULL); //d'une 3ème
xTaskCreate(FaireTruc3,"FaireTruc3",4096,NULL,1,NULL); //d'une 4ème
}
Contenu de la tâche :
void LedBlink(void * parameter)
{
while(1)
{
digitalWrite(LED, !digitalRead(LED));
vTaskDelay(500/ portTICK_PERIOD_MS); //On redonne la main à Free RTOS pour qu'il execute d'autres tâches pendant 500ms
}
}
Juste pour faire clignoter une LED, c’est peut être un peu lourd mais dès que vous aurez plusieurs tâches à exécuter ça vous simplifiera grandement les choses et vous évitera de vous soucier du séquencement de vos tâches.