// Définition de la structure pour les tâches
struct Task {
const char* name; // Nom de la tâche
unsigned long period; // Période en millisecondes
unsigned long execTime; // Temps d'exécution en millisecondes
unsigned long lastRun; // Dernière exécution
unsigned long execEnd; // Fin d'exécution
};
// Définition des périodes et temps d'exécution pour chaque tâche
Task tasks[] = {
{"Tâche 1", 50, 20, 0, 0}, // Tâche 1: période 50 ms, temps d'exécution 20 ms
{"Tâche 2", 100, 25, 0, 0}, // Tâche 2: période 100 ms, temps d'exécution 25 ms
{"Tâche 3", 200, 50, 0, 0} // Tâche 3: période 200 ms, temps d'exécution 50 ms
};
const int numTasks = sizeof(tasks) / sizeof(tasks[0]);
void setup() {
Serial.begin(9600); // Initialisation de la communication série
Serial.println("Démarrage du système temps réel...");
}
void executeTask(Task &task) {
Serial.print(task.name);
Serial.print(" exécutée à ");
Serial.print(millis());
Serial.println(" ms");
task.execEnd = millis() + task.execTime; // Calculer la fin d'exécution
}
void loop() {
unsigned long current_time = millis(); // Temps actuel en millisecondes
for (int i = 0; i < numTasks; i++) {
// Vérification de la disponibilité de chaque tâche en fonction de sa période
if (current_time - tasks[i].lastRun >= tasks[i].period && current_time >= tasks[i].execEnd) {
tasks[i].lastRun = current_time; // Mise à jour du dernier temps d'exécution
executeTask(tasks[i]); // Exécuter la tâche
}
}
// Affichage des derniers temps d'exécution pour chaque tâche
for (int i = 0; i < numTasks; i++) {
Serial.print(tasks[i].name);
Serial.print(" last run: ");
Serial.print(tasks[i].lastRun);
Serial.print(" | ");
}
Serial.println();
delay(2000); // Petit délai pour stabiliser l'ordonnancement
}