TaskHandle_t task1Handle;
TaskHandle_t task2Handle;
TaskHandle_t task3Handle;
void setup() {
Serial.begin(9600);
Serial.println(F("In Setup function"));
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(14, OUTPUT);
xTaskCreate(MyTask1, "Task1", 1000, NULL, 1, &task1Handle);
xTaskCreate(MyTask2, "Task2", 1000, NULL, 2, &task2Handle);
xTaskCreate(MyTask3, "Task3", 1000, NULL, 3, &task3Handle);
xTaskCreate(MyIdleTask, "IdleTask", 1000, NULL, 0, NULL);
xTaskCreate(TaskController, "TaskController", 1000, NULL, 4, NULL); // Higher priority
}
void loop() {
// Empty - Task scheduling is handled in the FreeRTOS tasks
}
static void MyTask1(void* pvParameters) {
while (1) {
digitalWrite(13, HIGH);
digitalWrite(12, LOW);
digitalWrite(14, LOW);
Serial.println("Task1 is running");
vTaskDelay(2100 / portTICK_PERIOD_MS);
}
}
static void MyTask2(void* pvParameters) {
while (1) {
digitalWrite(13, LOW);
digitalWrite(12, HIGH);
digitalWrite(14, LOW);
Serial.println("Task2 is running");
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
}
static void MyTask3(void* pvParameters) {
while (1) {
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(14, HIGH);
Serial.println("Task3 is running");
vTaskDelay(2005 / portTICK_PERIOD_MS);
}
}
static void MyIdleTask(void* pvParameters) {
while (1) {
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(14, LOW);
Serial.println("IdleTask is running");
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
static void TaskController(void* pvParameters) {
while (1) {
// Wait for 10 seconds before suspending Task1
vTaskDelay(10000 / portTICK_PERIOD_MS);
Serial.println("Suspending Task1");
vTaskSuspend(task1Handle);
// Wait for an additional 5 seconds before resuming Task1
vTaskDelay(5000 / portTICK_PERIOD_MS);
Serial.println("Resuming Task1");
vTaskResume(task1Handle);
vTaskDelay(10000 / portTICK_PERIOD_MS);
Serial.println("Suspending Task2");
vTaskSuspend(task2Handle);
// Wait for an additional 5 seconds before resuming Task1
vTaskDelay(5000 / portTICK_PERIOD_MS);
Serial.println("Resuming Task2");
vTaskResume(task2Handle);
vTaskDelay(10000 / portTICK_PERIOD_MS);
Serial.println("Suspending Task3");
vTaskSuspend(task3Handle);
// Wait for an additional 5 seconds before resuming Task1
vTaskDelay(5000 / portTICK_PERIOD_MS);
Serial.println("Resuming Task3");
vTaskResume(task3Handle);
}
}