#include <Arduino_FreeRTOS.h>
// Definitions for LED pins
#define LED1_PIN 13 // Built-in LED on many Arduino boards
#define LED2_PIN 12 // Another LED connected to pin 12
// Function prototypes
void vTaskLED1(void *pvParameters);
void vTaskLED2(void *pvParameters);
// Delay periods for the LEDs
#define LED1_DELAY 500 / portTICK_PERIOD_MS
#define LED2_DELAY 1000 / portTICK_PERIOD_MS
struct BlinkingLED {
int pin;
int delay;
char name[20];
TaskHandle_t taskHandle;
};
struct BlinkingLED leds[] = {
{13, 500, "LED1"},
{12, 1000, "LED2"}
};
void setup() {
// Initialize the hardware
pinMode(leds[0].pin, OUTPUT);
pinMode(leds[1].pin, OUTPUT);
Serial.begin(9600);
// Create the tasks
xTaskCreate(vTaskBlink, "LED1 Task", configMINIMAL_STACK_SIZE, leds, 1, &(leds[0].taskHandle));
xTaskCreate(vTaskBlink, "LED2 Task", configMINIMAL_STACK_SIZE, leds + 1, 1, &(leds[1].taskHandle));
TaskHandle_t taskHandles[] = {leds[0].taskHandle, leds[1].taskHandle};
xTaskCreate(
vBlinkResume,
"Resume LED blinks Task",
configMINIMAL_STACK_SIZE,
taskHandles,
1,
NULL
);
// Start the scheduler
vTaskStartScheduler();
}
void loop() {
// Nothing to do here, everything is done in the tasks
}
void vBlinkResume(TaskHandle_t* taskHandles){
vTaskDelay(10000 / portTICK_PERIOD_MS);
vTaskResume(taskHandles[0]);
vTaskResume(taskHandles[1]);
}
void vTaskBlink(struct BlinkingLED* led) {
int count = 0;
for (;;) {
// Toggle the LED
digitalWrite(led->pin, !digitalRead(led->pin));
Serial.print(led->name);
Serial.print(":");
Serial.print(digitalRead(led->pin));
Serial.print(" COUNT :");
Serial.println(count);
// Delay for a period
vTaskDelay(led->delay / portTICK_PERIOD_MS);
if (count == 5) {
vTaskSuspend(led->taskHandle);
}
count++;
}
}