// Include necessary libraries and headers
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include <freertos/semphr.h>
#include "freertos/queue.h"
// Define LED pin numbers
#define LED_PIN1 2
#define LED_PIN2 4
#define LED_PIN3 5
// Declare semaphore and queue handles
SemaphoreHandle_t semaphore;
QueueHandle_t queue;
// Setup function to initialize pins, semaphore, queue, and tasks
void setup() {
Serial.begin(9600);
// Set LED pins as output
pinMode(LED_PIN1, OUTPUT);
pinMode(LED_PIN2, OUTPUT);
pinMode(LED_PIN3, OUTPUT);
// Create a binary semaphore
semaphore = xSemaphoreCreateBinary();
// Create a queue capable of containing 10 integers
queue = xQueueCreate(10, sizeof(int));
// Create sender and receiver tasks
xTaskCreate(senderTask, "senderTask", 1024, NULL, 1, NULL);
xTaskCreate(receiverTask1, "receiverTask1", 1024, NULL, 1, NULL);
xTaskCreate(receiverTask2, "receiverTask2", 1024, NULL, 1, NULL);
xTaskCreate(receiverTask3, "receiverTask3", 1024, NULL, 1, NULL);
}
// Sender task function
void senderTask(void * parameter){
// Define blinking intervals
int interval[] = {250, 500, 500};
int index = 0;
for (;;){
// Give semaphore and send interval to the queue
xSemaphoreGive(semaphore);
xQueueSend(queue, &interval[index], portMAX_DELAY);
// Cycle through intervals
index = (index + 1)%3;
// Delay for 0,1 second
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
// Receiver task function for LED_PIN1
void receiverTask1(void * parameter){
int interval;
for(;;){
// Wait for semaphore and then try to receive from the queue
if (xSemaphoreTake(semaphore, portMAX_DELAY)){
if (xQueueReceive(queue, &interval, portMAX_DELAY)){
// Blink LED with received interval
Serial.println("This is Task 1");
digitalWrite(LED_PIN1, HIGH);
vTaskDelay(interval / portTICK_PERIOD_MS);
digitalWrite(LED_PIN1, LOW);
vTaskDelay(interval / portTICK_PERIOD_MS);
}
}
}
}
// Receiver task function for LED_PIN2
void receiverTask2(void * parameter){
int interval;
for(;;){
// Wait for semaphore and then try to receive from the queue
if (xSemaphoreTake(semaphore, portMAX_DELAY)){
if (xQueueReceive(queue, &interval, portMAX_DELAY)){
// Blink LED with received interval
Serial.println("This is Task 2");
digitalWrite(LED_PIN2, HIGH);
vTaskDelay(interval / portTICK_PERIOD_MS);
digitalWrite(LED_PIN2, LOW);
vTaskDelay(interval / portTICK_PERIOD_MS);
}
}
}
}
// Receiver task function for LED_PIN3
void receiverTask3(void * parameter){
int interval;
for(;;){
// Wait for semaphore and then try to receive from the queue
if (xSemaphoreTake(semaphore, portMAX_DELAY)){
if (xQueueReceive(queue, &interval, portMAX_DELAY)){
// Blink LED with received interval
Serial.println("This is Task 3");
digitalWrite(LED_PIN3, HIGH);
vTaskDelay(interval / portTICK_PERIOD_MS);
digitalWrite(LED_PIN3, LOW);
vTaskDelay(interval / portTICK_PERIOD_MS);
}
}
}
}
void loop() {
//Do nothing
}