// Task States
enum TaskState { READY, RUNNING, BLOCKED, TERMINATED };
// Task structure
struct Task {
const char* name;
TaskState state;
int priority;
int progress; // simulate execution steps
int execTime; // total steps to complete
};
// Define two tasks with different priorities
Task task1 = {"Task1", READY, 2, 0, 5}; // Lower priority
Task task2 = {"Task2", READY, 1, 0, 3}; // Higher priority
Task* tasks[] = {&task1, &task2};
const int numTasks = 2;
void setup() {
Serial.begin(9600);
Serial.println("Starting task management demo");
}
void runTask(Task* t) {
if (t->state == TERMINATED) return;
t->state = RUNNING;
Serial.print(t->name);
Serial.print(" running step ");
Serial.print(t->progress + 1);
Serial.print("/");
Serial.println(t->execTime);
delay(500); // simulate work
t->progress++;
if (t->progress >= t->execTime) {
t->state = TERMINATED;
Serial.print(t->name);
Serial.println(" terminated");
} else {
t->state = READY; // cooperative yield
}
}
// Simple priority scheduler (lower number = higher priority)
Task* schedule() {
Task* nextTask = NULL;
for (int i = 0; i < numTasks; i++) {
if (tasks[i]->state == READY) {
if (nextTask == NULL || tasks[i]->priority < nextTask->priority) {
nextTask = tasks[i];
}
}
}
return nextTask;
}
void loop() {
Task* taskToRun = schedule();
if (taskToRun != NULL) {
runTask(taskToRun);
} else {
Serial.println("All tasks terminated.");
while(1); // stop loop
}
}