![Projet ordonnancement des tâches avec Arduino (19)](https://www.electronique-mixte.fr/wp-content/uploads/2020/11/Projet-ordonnancement-des-taches-avec-Arduino-19-scaled.jpg)
![Projet ordonnancement des tâches avec Arduino (17)](https://www.electronique-mixte.fr/wp-content/uploads/2020/11/Projet-ordonnancement-des-taches-avec-Arduino-17-scaled.jpg)
Objectifs
- Savoir ordonnancer les taches avec Arduino
- Savoir définir les conditions de départs et arrêts des taches
- Savoir initialiser l’ordonnanceur
- Etc.
Initialisation: Durée & temps de départ
void setup()
{
// Init écheances des taches (en ms)
Tache_duree[0]=5000;
Tache_duree[1]=5000;
Tache_duree[2]=5000;
// Init temps de début des tâches (en ms)
Tache_start[0]=10000;
Tache_start[1]=20000;
Tache_start[2]=30000;
// Init affichage de la tache active
Serial.begin(9600);
// Init des sorties
pinMode(PinLED1,OUTPUT);
pinMode(PinLED2,OUTPUT);
pinMode(PinLED3,OUTPUT);
}
Lecture de l’ordonnanceur
Initialisation de l’ordonnanceur avec la période de répétition
Master_time=(Master_time % DureeRep_ms);
Génération des conditions de début des taches
for (i=0;i<NumTache;i++)
{
Tache_on[i]=(Master_time>Tache_start[i]);
}
Génération des conditions d’arrêts
for (i=0;i<NumTache;i++)
{
Tache_off[i]=Tache_on[i]& (Master_time<(Tache_start[i]+Tache_duree[i]));
}
Exécution des tâches
// Tâche 1
if(Tache_off[0])
{
analogWrite(PinLED1,255);
analogWrite(PinLED2,0);
analogWrite(PinLED3,0);
Tache_Active=1;
}
// Tâche 2
else if(Tache_off[1])
{
analogWrite(PinLED1,0);
analogWrite(PinLED2,255);
analogWrite(PinLED3,0);
Tache_Active=2;
}
// Tâche 3
else if(Tache_off[2])
{
analogWrite(PinLED1,0);
analogWrite(PinLED2,0);
analogWrite(PinLED3,255);
Tache_Active=3;
}
// Autres: Désactivation des sorties
else
{
analogWrite(PinLED1,0);
analogWrite(PinLED2,0);
analogWrite(PinLED3,0);
Tache_Active=0;
}
// Affichage de la tache active
Serial.print(Master_time/1000);
Serial.print(":");
Serial.println(Master_time%1000);
}
Exemple de 3 tâches
#define NumTache 3
#define DureeRep_ms 40000
#define PinLED1 2
#define PinLED2 3
#define PinLED3 4
unsigned char Tache_on[NumTache],Tache_off[NumTache];
unsigned long Tache_start[NumTache],i;
unsigned long Master_time=0, Tache_duree[NumTache];
unsigned char Tache_Active=0;
void setup()
{
// Init écheances des taches (en ms)
Tache_duree[0]=5000;
Tache_duree[1]=5000;
Tache_duree[2]=5000;
// Init temps de début des tâches (en ms)
Tache_start[0]=10000;
Tache_start[1]=20000;
Tache_start[2]=30000;
// Init affichage de la tache active
Serial.begin(9600);
// Init des sorties
pinMode(PinLED1,OUTPUT);
pinMode(PinLED2,OUTPUT);
pinMode(PinLED3,OUTPUT);
}
void loop()
{
// Lecture de l'ordonnanceur
Master_time=millis();
// Init de l'ordonnanceur avec la période de répétition
Master_time=(Master_time % DureeRep_ms);
// Génération des conditions de début des taches
for (i=0;i<NumTache;i++)
{
Tache_on[i]=(Master_time>Tache_start[i]);
}
// Génération des conditions d'arrêts
for (i=0;i<NumTache;i++)
{
Tache_off[i]=Tache_on[i]& (Master_time<(Tache_start[i]+Tache_duree[i]));
}
// Exécution des tâches
// Tâche 1
if(Tache_off[0])
{
analogWrite(PinLED1,255);
analogWrite(PinLED2,0);
analogWrite(PinLED3,0);
Tache_Active=1;
}
// Tâche 2
else if(Tache_off[1])
{
analogWrite(PinLED1,0);
analogWrite(PinLED2,255);
analogWrite(PinLED3,0);
Tache_Active=2;
}
// Tâche 3
else if(Tache_off[2])
{
analogWrite(PinLED1,0);
analogWrite(PinLED2,0);
analogWrite(PinLED3,255);
Tache_Active=3;
}
// Autres: Désactivation des sorties
else
{
analogWrite(PinLED1,0);
analogWrite(PinLED2,0);
analogWrite(PinLED3,0);
Tache_Active=0;
}
// Affichage de la tache active
Serial.print(Master_time/1000);
Serial.print(":");
Serial.println(Master_time%1000);
}
Sujets connexes
- arduino boucles simultanées
- arduino actions simultanées
- plusieurs loop arduino
- arduino plusieurs capteurs
- arduino temporisation non bloquante
- arduino multitâche avec timer
- arduino astuces
- programme arduino complexe
- arduino multitâche
- machine d’état arduino