#include <Arduino_FreeRTOS.h>
#include <semphr.h>
#define redled 3
#define yellowled 4
#define greenled 5
SemaphoreHandle_t xBinarySemaphore;
void setup()
{
Serial.begin(9600);
// Initialize LED pins
pinMode(redled, OUTPUT);
pinMode(yellowled, OUTPUT);
pinMode(greenled, OUTPUT);
xBinarySemaphore = xSemaphoreCreateBinary();
xSemaphoreGive(xBinarySemaphore);
xTaskCreate(Taskredled, "redled", 100, NULL, 1, NULL);
xTaskCreate(Taskyellowled, "yellowled", 100, NULL, 1, NULL);
xTaskCreate(Taskgreenled, "greenled", 100, NULL, 1, NULL);
}
void loop()
{
// Empty loop as tasks are running in FreeRTOS
}
void Taskredled(void *pvParameters)
{
while (1)
{
if (xSemaphoreTake(xBinarySemaphore, portMAX_DELAY))
{
for (int i = 0; i < 5; i++)
{
digitalWrite(redled, HIGH);
vTaskDelay(500 / portTICK_PERIOD_MS);
digitalWrite(redled, LOW);
vTaskDelay(500 / portTICK_PERIOD_MS);
}
xSemaphoreGive(xBinarySemaphore);
}
vTaskDelay(10 / portTICK_PERIOD_MS);
}
}
void Taskyellowled(void *pvParameters) // Small delay to prevent busy waiting
{
while (1)
{
if (xSemaphoreTake(xBinarySemaphore, portMAX_DELAY))
{
for (int i = 0; i < 5; i++)
{
digitalWrite(yellowled, HIGH);
vTaskDelay(500 / portTICK_PERIOD_MS);
digitalWrite(yellowled, LOW);
vTaskDelay(500 / portTICK_PERIOD_MS);
}
xSemaphoreGive(xBinarySemaphore);
}
vTaskDelay(10 / portTICK_PERIOD_MS);
}
}
void Taskgreenled(void *pvParameters)
{
while (1) {
if (xSemaphoreTake(xBinarySemaphore, portMAX_DELAY))
{
for (int i = 0; i < 5; i++)
{
digitalWrite(greenled, HIGH);
vTaskDelay(500 / portTICK_PERIOD_MS);
digitalWrite(greenled, LOW);
vTaskDelay(500 / portTICK_PERIOD_MS);
}
xSemaphoreGive(xBinarySemaphore);
}
vTaskDelay(10 / portTICK_PERIOD_MS);
}
}