#include <Arduino_FreeRTOS.h> // Este inclusa biblioteca FreeRTOS
#include <semphr.h> // Este inclusa biblioteca semhr.h, pentru utilizarea semafoarelor
// Definitiile celor 3 functii ce vor fi executate
void TaskBlink1( void *pvParameters );
void TaskBlink2( void *pvParameters );
void Taskprint( void *pvParameters );
// Definim 3 handle-uri pentru semafoare, necesare identificarii ulterioare
SemaphoreHandle_t sem1;
SemaphoreHandle_t sem2;
SemaphoreHandle_t sem3;
void setup() {
Serial.begin(9600); // Este initializata comunicatia seriala
// Cream 3 semafoare binare
sem1 = xSemaphoreCreateBinary();
sem2 = xSemaphoreCreateBinary();
sem3 = xSemaphoreCreateBinary();
// Deoarece semafoarele sunt initializate cu 0 (vezi documentatia), primul trebuie "setat" pe 1, pentru a
// se putea intra in bucla while a taskului 1
xSemaphoreGive(sem1);
// Sunt create cele 3 taskuri, fiecare cu 128 de cuvinte de memorie rezervate si prioritate egala cu 1
xTaskCreate(TaskBlink1, "task1", 128, NULL, 1, NULL);
xTaskCreate(TaskBlink2, "task2", 128, NULL, 0, NULL);
xTaskCreate(Taskprint, "task3", 128, NULL, 1, NULL);
vTaskStartScheduler(); // Este pornit algoritmul de planificare
}
void loop() {} // Gol
// Functia executata de taskul 1
void TaskBlink1(void *pvParameters) {
pinMode(7, OUTPUT); // Pinul 5 este setat ca pin de output
while (1) // Bucla infinita
{
if (xSemaphoreTake(sem3, portMAX_DELAY) == pdTRUE) { // Daca semaforul este "luat cu succes". Setam valoarea maxima de asteptare la infinit,
// pentru a bloca taskul pana la eliberarea semaforului
Serial.println("Task1"); // Se transmite informatia despre task pe magistrala seriala
digitalWrite(7, HIGH); // U = 5V
vTaskDelay( 200 / portTICK_PERIOD_MS ); // Se asteapta 200ms. Fara impartirea la constanta portTICK_PERIOD_MS, durata ar fi fost de 200 cicluri de ceas
digitalWrite(7, LOW); // U = 0V
vTaskDelay( 200 / portTICK_PERIOD_MS );
xSemaphoreGive(sem1); // Se "seteaza" semaforul 2 pe 1
}
}
}
// Functia executata de taskul 2
void TaskBlink2(void *pvParameters)
{
pinMode(6, OUTPUT);
while (1)
{
if (xSemaphoreTake(sem2, portMAX_DELAY) == pdTRUE) {
Serial.println("Task2"); // Se transmite informatia despre task pe magistrala seriala
digitalWrite(6, HIGH); // U = 5V
vTaskDelay( 300 / portTICK_PERIOD_MS ); // Se asteapta 300ms.
digitalWrite(6, LOW); // U = 0V
vTaskDelay( 300 / portTICK_PERIOD_MS );
xSemaphoreGive(sem3);
}
}
}
// Functia executata de taskul 3
void Taskprint(void *pvParameters) {
int counter = 0;
while (1)
{
if (xSemaphoreTake(sem1, portMAX_DELAY) == pdTRUE) {
counter++; // Este incrementat contorul la fiecare iteratie
Serial.println(counter); // Si afisata valoarea
vTaskDelay(500 / portTICK_PERIOD_MS); // Se asteapta 500ms
xSemaphoreGive(sem2);
}
}
}