//El siguiente codigo ontrolar dos LEDs de manera concurrente, lo que podría provocar
// un deadlock o starvation si no se maneja correctamente
//Se realizan dos tareas, task1 y task2, y dos recursos compartidos, resource1 y resource2.
//Ambas tareas necesitan ambos recursos para completar su ejecución. Sin embargo,
//si ambas tareas adquieren un recurso y luego intentan adquirir el otro, pueden entrar
//en un estado de espera indefinida si uno de los recursos está siendo retenido por la otra
//tarea.En este ejemplo, ambas tareas intentan adquirir resource1 y resource2 en un orden
//diferente, lo que puede llevar a un deadlock si las tareas se bloquean mutuamente esperando
//que el otro recurso se libere.
#include <Arduino_FreeRTOS.h>
#include <semphr.h>
//se declaran dos semáforos que actuarán como recursos compartidos entre las tareas.
SemaphoreHandle_t resource1;
SemaphoreHandle_t resource2;
// Estos son los prototipos de las funciones que serán las tareas que se ejecutarán en el sistema.
void task1(void *pvParameters);
void task2(void *pvParameters);
void setup() {
//Aquí se inicializan los semáforos como mutex, lo que significa que solo
//una tarea puede tener acceso al recurso compartido a la vez.
resource1 = xSemaphoreCreateMutex();
resource2 = xSemaphoreCreateMutex();
// Creación de tareas
xTaskCreate(task1, "Task1", 100, NULL, 1, NULL);
xTaskCreate(task2, "Task2", 100, NULL, 1, NULL);
}
void loop() {
// No se usa en FreeRTOS, las tareas se manejan independientemente
}
void task1(void *pvParameters) {
(void) pvParameters;
while(1) {
// Adquirir recurso1
if(xSemaphoreTake(resource1, portMAX_DELAY) == pdTRUE) {
// Realizar alguna tarea con resource1
// Intentar adquirir recurso
if(xSemaphoreTake(resource2, portMAX_DELAY) == pdTRUE) {
// Realizar alguna tarea con recurso2
// Liberar recurso2
xSemaphoreGive(resource2);
}
// Liberar recurso1
xSemaphoreGive(resource1);
}
vTaskDelay(pdMS_TO_TICKS(1000)); // Esperar 1 segundo
}
}
void task2(void *pvParameters) {
(void) pvParameters;
while(1) {
// Adquirir recurso2
if(xSemaphoreTake(resource2, portMAX_DELAY) == pdTRUE) {
// Realizar alguna tarea con recurso2
// Intentar adquirir resource1
if(xSemaphoreTake(resource1, portMAX_DELAY) == pdTRUE) {
// Realizar alguna tarea con recurso1
// Liberar recurso1
xSemaphoreGive(resource1);
}
// Liberar recurso2
xSemaphoreGive(resource2);
}
vTaskDelay(pdMS_TO_TICKS(1000)); // Esperar 1 segundo
}
}