// ambas tareas adquirirán el semáforo, realizarán su sección crítica
// y luego quedarán bloqueadas permanentemente, ya que ninguna de ellas
//liberará el semáforo, lo que resultará en un deadlock.
#include <Arduino_FreeRTOS.h>
#include <semphr.h>
// Definiciones de pines para los LEDs
#define LED_PIN_1 4
#define LED_PIN_2 7
// Definiciones de prioridades de tareas
#define TASK1_PRIORITY 1
#define TASK2_PRIORITY 1
// Declaraciones de funciones de tareas
void task1(void *pvParameters);
void task2(void *pvParameters);
// Declaración del semáforo
SemaphoreHandle_t xSemaphore;
void setup() {
// Inicializar los pines de los LEDs
pinMode(LED_PIN_1, OUTPUT);
pinMode(LED_PIN_2, OUTPUT);
// Crear el semáforo
xSemaphore = xSemaphoreCreateMutex();
// Crear las tareas
xTaskCreate(task1, "Task1", 100, NULL, TASK1_PRIORITY, NULL);
xTaskCreate(task2, "Task2", 100, NULL, TASK2_PRIORITY, NULL);
// Iniciar el planificador de tareas
vTaskStartScheduler();
}
void loop() {
// No se hace nada en el loop porque las tareas corren en el planificador
}
void task1(void *pvParameters) {
(void) pvParameters;
// Intentar adquirir el semáforo
if (xSemaphoreTake(xSemaphore, portMAX_DELAY) == pdTRUE) {
digitalWrite(LED_PIN_1, HIGH);
delay(1000);
digitalWrite(LED_PIN_1, LOW);
// No se libera el semáforo
}
// La tarea termina
vTaskDelete(NULL);
}
void task2(void *pvParameters) {
(void) pvParameters;
// Intentar adquirir el semáforo
if (xSemaphoreTake(xSemaphore, portMAX_DELAY) == pdTRUE) {
digitalWrite(LED_PIN_2, HIGH);
delay(1000);
digitalWrite(LED_PIN_2, LOW);
// No se libera el semáforo
}
// La tarea termina
vTaskDelete(NULL);
}