#include <Arduino_FreeRTOS.h>
#include <semphr.h>
//Definicja semafora
SemaphoreHandle_t xSemaphore;
//Definicja zadań
void task1( void *pvParameters );
void task2( void *pvParameters );
void task3( void *pvParameters );
void setup()
{
//Utwórz semafor
xSemaphore = xSemaphoreCreateBinary();
Serial.begin(9600);
//Utwórz zadania
xTaskCreate(task1, "Task 1", 128, NULL, 1, NULL);
xTaskCreate(task2, "Task 2", 128, NULL, 1, NULL);
xTaskCreate(task3, "Task 3", 128, NULL, 1, NULL);
}
void loop()
{
//Pętla nie jest potrzebna
}
void task1( void *pvParameters )
{
while(1)
{
//Włącz diode
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
//Weź semafor
xSemaphoreTake( xSemaphore,20000/portTICK_PERIOD_MS);
//Wyłącz diode
digitalWrite(13, LOW);
//Zwolnij semafor
xSemaphoreGive(xSemaphore);
}
}
void task2( void *pvParameters )
{
while(1)
{
//Weź semafor
xSemaphoreTake( xSemaphore,200/portTICK_PERIOD_MS);
//Włącz diode
pinMode(12, OUTPUT);
digitalWrite(12, HIGH);
//Zwolnij semafor
xSemaphoreGive(xSemaphore);
//Wyłącz diode
digitalWrite(12, LOW);
//vTaskSuspend(NULL);
}
}
void task3( void *pvParameters )
{
while(1)
{
//Weź semafor
xSemaphoreTake( xSemaphore,200/portTICK_PERIOD_MS);
//Włącz diode
pinMode(7, OUTPUT);
digitalWrite(7, HIGH);
//Wyłącz diode
digitalWrite(7, LOW);
//opoznij task
vTaskDelay(200/portTICK_PERIOD_MS);
//Sprawdzamy, czy semafor jest dostępny
if (xSemaphoreTake(xSemaphore, portMAX_DELAY) == pdTRUE)
{
//Jeśli semafor jest dostępny, to go pobieramy
xSemaphoreTake(xSemaphore, 200/portTICK_PERIOD_MS);
}
}
}